使用 SDL_CreateTexture 创建的纹理似乎不支持透明度
Textures created with SDL_CreateTexture don't appear to support transparency
我想将多个表面(使用 TTF_* 创建)复制到单个纹理,但我似乎无法将生成的纹理渲染到正确处理透明度的 window 上。
static void example(void) {
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
TTF_Init();
SDL_Window* w = SDL_CreateWindow("", 0, 0, 200, 200, 0);
SDL_Renderer* r = SDL_CreateRenderer(w, -1, 0);
TTF_Font* f = TTF_OpenFont(MY_FONT, 100);
SDL_Color c = {.r = 0, .g = 255, .b = 0, .a = 255};
SDL_Surface* s = TTF_RenderGlyph32_Blended(f, 'A', c);
SDL_Texture* t = SDL_CreateTextureFromSurface(r, s);
#ifdef RENDER_COPY
SDL_Texture* t2 = SDL_CreateTexture(
r,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_TARGET,
s->w,
s->h);
SDL_SetRenderTarget(r, t2);
SDL_RenderCopy(r, t, NULL, NULL);
SDL_SetRenderTarget(r, NULL);
t = t2;
#endif
#ifdef RENDER_MEMCPY
SDL_Texture* t2 = SDL_CreateTexture(
r,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
s->w,
s->h);
SDL_Surface* s2;
sdl_try(SDL_LockTextureToSurface(t2, NULL, &s2));
memcpy(s2->pixels, s->pixels, s->w * s->h * sizeof(SDL_Color));
SDL_UnlockTexture(t2);
t = t2;
#endif
#ifdef RENDER_BLEND
SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);
#endif
SDL_SetRenderDrawColor(r, 255, 255, 255, 255);
SDL_RenderClear(r);
SDL_Rect rect = {.x = 0, .y = 0};
SDL_QueryTexture(t, NULL, NULL, &rect.w, &rect.h);
SDL_RenderCopy(r, t, &rect, &rect);
SDL_RenderPresent(r);
SDL_Event event;
do { SDL_WaitEvent(&event); } while (event.type != SDL_KEYDOWN);
}
没有 RENDER_COPY
,我得到一个纹理(通过 SDL_CreateTextureFromSurface
创建)正确混合到渲染目标上(这就是我想要的,但多个表面组合成一个纹理。)
使用RENDER_COPY
(即创建第二个纹理然后将其复制到)纹理的背景为黑色。这是一个人为的例子,因为只有一个表面被复制,但我想将多个表面复制到 t2
。)
在 RENDER_BLEND
中,黑色大部分消失了,但纹理就像混合到黑色背景上一样。
有没有办法创建可以设置为完全透明而不是纯色的纹理?我也尝试过直接设置像素 (RENDER_MEMCPY
),但结果只是纯色,因为每个像素中的 alpha 都被忽略了:
SDL 版本为 2.0.20。
想通了。从第一个纹理到第二个纹理执行 SDL_RenderCopy
时,第一个纹理的混合模式应设置为 none:
SDL_SetTextureBlendMode(t, SDL_BLENDMODE_NONE);
现在复制第二个纹理时(SDL_BLENDMODE_BLEND
)边缘没有黑色伪影。
我想将多个表面(使用 TTF_* 创建)复制到单个纹理,但我似乎无法将生成的纹理渲染到正确处理透明度的 window 上。
static void example(void) {
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
TTF_Init();
SDL_Window* w = SDL_CreateWindow("", 0, 0, 200, 200, 0);
SDL_Renderer* r = SDL_CreateRenderer(w, -1, 0);
TTF_Font* f = TTF_OpenFont(MY_FONT, 100);
SDL_Color c = {.r = 0, .g = 255, .b = 0, .a = 255};
SDL_Surface* s = TTF_RenderGlyph32_Blended(f, 'A', c);
SDL_Texture* t = SDL_CreateTextureFromSurface(r, s);
#ifdef RENDER_COPY
SDL_Texture* t2 = SDL_CreateTexture(
r,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_TARGET,
s->w,
s->h);
SDL_SetRenderTarget(r, t2);
SDL_RenderCopy(r, t, NULL, NULL);
SDL_SetRenderTarget(r, NULL);
t = t2;
#endif
#ifdef RENDER_MEMCPY
SDL_Texture* t2 = SDL_CreateTexture(
r,
SDL_PIXELFORMAT_ARGB8888,
SDL_TEXTUREACCESS_STREAMING,
s->w,
s->h);
SDL_Surface* s2;
sdl_try(SDL_LockTextureToSurface(t2, NULL, &s2));
memcpy(s2->pixels, s->pixels, s->w * s->h * sizeof(SDL_Color));
SDL_UnlockTexture(t2);
t = t2;
#endif
#ifdef RENDER_BLEND
SDL_SetTextureBlendMode(t, SDL_BLENDMODE_BLEND);
#endif
SDL_SetRenderDrawColor(r, 255, 255, 255, 255);
SDL_RenderClear(r);
SDL_Rect rect = {.x = 0, .y = 0};
SDL_QueryTexture(t, NULL, NULL, &rect.w, &rect.h);
SDL_RenderCopy(r, t, &rect, &rect);
SDL_RenderPresent(r);
SDL_Event event;
do { SDL_WaitEvent(&event); } while (event.type != SDL_KEYDOWN);
}
没有 RENDER_COPY
,我得到一个纹理(通过 SDL_CreateTextureFromSurface
创建)正确混合到渲染目标上(这就是我想要的,但多个表面组合成一个纹理。)
使用RENDER_COPY
(即创建第二个纹理然后将其复制到)纹理的背景为黑色。这是一个人为的例子,因为只有一个表面被复制,但我想将多个表面复制到 t2
。)
在 RENDER_BLEND
中,黑色大部分消失了,但纹理就像混合到黑色背景上一样。
有没有办法创建可以设置为完全透明而不是纯色的纹理?我也尝试过直接设置像素 (RENDER_MEMCPY
),但结果只是纯色,因为每个像素中的 alpha 都被忽略了:
SDL 版本为 2.0.20。
想通了。从第一个纹理到第二个纹理执行 SDL_RenderCopy
时,第一个纹理的混合模式应设置为 none:
SDL_SetTextureBlendMode(t, SDL_BLENDMODE_NONE);
现在复制第二个纹理时(SDL_BLENDMODE_BLEND
)边缘没有黑色伪影。