当前位置:首页 > 其他 > 正文内容

SDL3 入门(5):纹路烘托

邻居的猫1个月前 (12-09)其他1081

创立纹路

有三个 API 能够用来创立纹路:

  • SDL_CreateTexture 参数少,运用便利,适用于创立简略的纹路
  • SDL_CreateTextureFromSurface
    适用于从已有图画数据创立纹路
  • SDL_CreateTextureWithProperties 能够指定各种特色,功用强壮,用起来也比较杂乱,适用于别的两个 API 无法满意需求的状况

实践上前两个 API 内部都是经过调用 SDL_CreateTextureWithProperties 完成纹路创立的。这也是 SDL API 规划的特色,关于常用操作有简练的 API 完成,一起也有运用杂乱可是功用更灵敏强壮的 API 供给。

这儿咱们预备创立一个最小的四种色彩的纹路,像素尺度 2x2,也便是总计只要 4 个像素。首要运用数组界说图画数据:

uint8_t pixels[4 * 2 * 2] = {
    0,   0,   255, 255,  // b, g, r, a
    0,   255, 0,   255,  //
    255, 0,   0,   255,  //
    0,   255, 255, 255   //
};

SDL 对像素格局的界说是依照从高位到低位的色彩命名的,所以上面的数据对应的格局是 SDL_PIXELFORMAT_ARGB8888

由于已经有像素数据,所以咱们能够从图画数据创立 Surface 然后调用 SDL_CreateTextureFromSurface 从 Surface 创立纹路:

SDL_Surface* surface = SDL_CreateSurfaceFrom(pixels, 2, 2, 4 * 2, SDL_PIXELFORMAT_ARGB8888);
if (!surface) {
    SDL_Log("Create surface failed: %s", SDL_GetError());
    return -1;
}

SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
if (!texture) {
    SDL_Log("Create texture failed: %s", SDL_GetError());
    return -1;
}

图画混合形式挑选 None 也便是疏忽通明通道,缩放形式挑选接近点插值:

SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_NONE);
SDL_SetTextureScaleMode(texture, SDL_SCALEMODE_NEAREST);

烘托纹路

烘托纹路运用的 API 是 SDL_RenderTexture,能够经过参数指定烘托纹路的矩形区域,也能够指定方针矩形区域。这儿咱们挑选烘托整个纹路到方针中心邻近宽高各为窗口一般的矩形区域:

// 核算方针矩形
int width = 0;
int height = 0;
SDL_GetRenderOutputSize(renderer, &width, &height);
SDL_FRect dst_rect{};
dst_rect.w = width * 0.5f;
dst_rect.h = height * 0.5f;
dst_rect.x = (width - dst_rect.w) * 0.5f;
dst_rect.y = (height - dst_rect.h) * 0.5f;

// 烘托
SDL_SetRenderDrawColor(renderer, 16, 0, 16, 255);
SDL_RenderClear(renderer);
SDL_RenderTexture(renderer, texture, nullptr, &dst_rect);
SDL_RenderPresent(renderer);

烘托作用如下:

图中每种色彩对应的是开始的 2x2 图画中的一个像素,由于前面咱们挑选的缩放形式是接近点插值。实践图画处理中运用更多的是双线性插值,咱们能够修正前面的代码看下作用:

SDL_SetTextureScaleMode(texture, SDL_SCALEMODE_LINEAR);

烘托作用:

纹路格局

能够运用如下代码查询当时烘托器支撑的纹路格局:

void PrintSupportedTextureFormats(SDL_Renderer* renderer)
{
    SDL_PixelFormatEnum* texture_format = static_cast<SDL_PixelFormatEnum*>(SDL_GetProperty(
        SDL_GetRendererProperties(renderer), SDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER, nullptr));
    int index = 0;
    while (texture_format && *texture_format != SDL_PIXELFORMAT_UNKNOWN) {
        SDL_Log("Texture format[%d]: %s", index, SDL_GetPixelFormatName(*texture_format));
        ++texture_format;
        ++index;
    }
}

运用不同的图形引擎创立烘托器时支撑的纹路格局也不相同,下面是在一台 Windows 11 体系笔记本上的测验成果:

Format direct3d11 direct3d12 direct3d(9) opengl opengles2 vulkan software
SDL_PIXELFORMAT_ARGB8888 Y Y Y Y Y Y Y
SDL_PIXELFORMAT_ABGR8888 - - - Y Y - -
SDL_PIXELFORMAT_XRGB8888 Y Y - Y Y Y Y
SDL_PIXELFORMAT_XBGR8888 - - - Y Y - -
SDL_PIXELFORMAT_XBGR2101010 Y Y - - - Y -
SDL_PIXELFORMAT_RGBA64_FLOAT Y Y - - - Y -
SDL_PIXELFORMAT_YV12 Y Y Y Y Y Y -
SDL_PIXELFORMAT_IYUV Y Y Y Y Y Y -
SDL_PIXELFORMAT_NV12 Y Y - Y Y Y -
SDL_PIXELFORMAT_NV21 Y Y - Y Y Y -
SDL_PIXELFORMAT_P010 Y Y - - - Y -

能够看到 SDL_PIXELFORMAT_ARGB8888 格局被包含软件完成在内的一切图形引擎支撑,这正是咱们前面挑选运用该格局创立纹路的原因,能够便利的挑选各个图形引擎进行测验。

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=784

分享给朋友:

“SDL3 入门(5):纹路烘托” 的相关文章

8条项目办理知识库,小白必看!

8条项目办理知识库,小白必看!

关于项目办理的新手来说,了解项目办理的基本概念和流程是成功的第一步。以下是8条项目办理知识库,协助小白从根底开端逐渐提高自己的项目办理才能。 1. 项目办理的五大进程组 项目办理的中心是五大进程组,它们是: 发动进程组:承认项目的方针、规模、资源需求和项目团队,拟定项目规章。 规划进程组:拟定具体的...

2024年项目办理趋势猜测:大厂都在重视什么?

2024年项目办理趋势猜测:大厂都在重视什么?

在2024年,项目办理的趋势持续遭到技能、长途作业和灵敏办法等多种要素的影响。大厂和各行业抢先企业都在重视以下几个要害趋势: 1. AI与主动化的深度集成 人工智能(AI)和主动化技能的引进,正在极大改动项目办理的办法。大厂越来越多地依靠AI来猜测项目危险、主动化重复性使命,并依据数据优化决议计划进...

Java 面试用什么项目?满是商场秒杀 RPC,我吐了

Java 面试用什么项目?满是商场秒杀 RPC,我吐了

看了几百份简历,真的超越 90% 的小伙伴的项目是商城、RPC、秒杀、论坛、外卖、点评等等烂大街的项目,人人都知道这些项目烂大街了,但大部分同学仍是得硬着头皮做,没办法,网络上能找到的、教程比较完善的就这些项目了,做的话好歹有个项目,不做那就真能写校园做的废物学生办理体系了。 我深刻了解小伙伴的痛点...

XSS常见问题

XSS常见问题

XSS原理 web应用程序对输入和输出没有进行严厉过滤、进犯者能够刺进结构的歹意javascript脚本,当正常用户阅读网页时,被阅读器当作有用代码解析履行,盗取用户数据或履行其他歹意操作。 DOM型xss缝隙简单呈现的当地有哪些? 1、能够被innerHTML或outerHTML特点修正的节...

一款 IDEA 必备的 JSON 处理东西插件 — Json Assistant

一款 IDEA 必备的 JSON 处理东西插件 — Json Assistant

Json Assistant 是根据 IntelliJ IDEs 的 JSON 东西插件,让 JSON 处理变得更轻松! 主要功用 彻底支撑 JSON5 JSON 窗口(多选项卡) 选项卡更名 移动至主修改器 用新窗口翻开选项卡内容 JSONPath 查询 历史记载 JSON 导出 JSON 格...

开源关系型数据库,构建高效数据管理平台的关键

开源关系型数据库,构建高效数据管理平台的关键

开源关系型数据库(Open Source Relational Database Management System, OSRDBMS)是指遵循某种开源协议,允许用户自由使用、修改和分发的关系型数据库管理系统。它们通常由一个或多个社区、公司或个人开发和维护,并提供多种功能和工具,以满足不同的数据存储...