使用 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)边缘没有黑色伪影。