SDL3 入门(5):纹路烘托
创立纹路
有三个 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
格局被包含软件完成在内的一切图形引擎支撑,这正是咱们前面挑选运用该格局创立纹路的原因,能够便利的挑选各个图形引擎进行测验。