SDL_SetSurfaceAlphaMod上的混淆

问题描述 投票:0回答:1

我已经阅读了有关SDL_SetSurfaceAlphaMod的文档。尽管alpha调制公式看起来非常简单,但是我无法预测在代码中使用它的结果。显然我的理解是不完整的。

为了阐明我的想法,我编写了一段代码(请参见下文)。 这个想法是在红色背景上放四个黑色的正方形,分成两行,每行两个。

顶部的两个正方形为黑色,因为这是使用SDL_CreateRGBSurface创建的表面默认使用的颜色。不使用SDL_FillRect。

底部的两个正方形在创建后使用SDL_FillRect将其设置为黑色(即使它们仍然为黑色)。

左侧的正方形的alpha调制值为0。

右侧的正方形的alpha调制值为255。

int main(int argc, char ** argv)
{
    SDL_Window * windowMain;
    SDL_Surface * surfaceMain;
    Uint32 rmask, gmask, bmask, amask;

    // Main window suface - red background
    windowMain = SDL_CreateWindow("Test Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 480, 360, 0);
    surfaceMain = SDL_GetWindowSurface(windowMain);
    Uint32 redBG = SDL_MapRGB(surfaceMain->format, 255, 0, 0);
    SDL_FillRect(surfaceMain, NULL, redBG);

#if SDL_BYTEORDER == SDL_BIG_ENDIAN
    rmask = 0xff000000;
    gmask = 0x00ff0000;
    bmask = 0x0000ff00;
    amask = 0x000000ff;
#else
    rmask = 0x000000ff;
    gmask = 0x0000ff00;
    bmask = 0x00ff0000;
    amask = 0xff000000;
#endif

    SDL_Surface * noFillSquare = SDL_CreateRGBSurface(0, 100, 100, 32, rmask, gmask, bmask, amask);
    SDL_Surface * blackFillSquare = SDL_CreateRGBSurface(0, 100, 100, 32, rmask, gmask, bmask, amask);
    Uint32 blackFG = SDL_MapRGB(blackFillSquare->format, 0, 0, 0);
    SDL_FillRect(blackFillSquare, NULL, blackFG);

    while (true)
    {
        showSurface(noFillSquare, surfaceMain, 0, 0, 100, 50); // Top left rectangle
        showSurface(noFillSquare, surfaceMain, 255, 0, 300, 50); // Top right rectangle (not displayed)
        showSurface(blackFillSquare, surfaceMain, 0, 0, 100, 200); // Bottom left rectangle
        showSurface(blackFillSquare, surfaceMain, 255, 0, 300, 200); // Bottom right rectangle

        SDL_UpdateWindowSurface(windowMain);
    }

    return 1;
}

void showSurface(SDL_Surface * srcSurface, SDL_Surface * dstSurface, Uint8 srcAlpha, Uint8 dstAlpha, int x, int y)
{
    SDL_Rect rect = { x, y, srcSurface->w, srcSurface->h };
    SDL_SetSurfaceAlphaMod(srcSurface, srcAlpha);
    SDL_SetSurfaceAlphaMod(dstSurface, dstAlpha);
    SDL_BlitSurface(srcSurface, NULL, dstSurface, &rect);
}

在代码中运行代码结果:

Display from above code

如您所见,未显示右上方的黑色正方形。

我想逐步解释为什么一个正方形没有出现,而其他三个正方形却出现。

我发现SDL 2.0文档非常粗略,尤其是涉及表面时。

sdl-2
1个回答
0
投票

[创建曲面时,SDL在像素阵列上执行memset(0)。它确实会产生黑色,但是alpha也会变为0-这是完全透明的。将0乘以alpha修饰符仍将得出0。

FillRect用完全不透明的颜色替换alpha,因为您使用的是SDL_MapRGB,而不是SDL_MapRGBA,字母0。

© www.soinside.com 2019 - 2024. All rights reserved.