C++ SDL2纹理';s像素格式和表面颜色遮罩

C++ SDL2纹理';s像素格式和表面颜色遮罩,c++,sdl,sdl-2,C++,Sdl,Sdl 2,我正在尝试为像素操作创建SDL_曲面,但是在设置曲面的颜色遮罩时出现了一些问题,因为填充颜色缓冲区时颜色不正确(请参阅注释,我正在尝试将u8vec4解释为RGBA颜色): const int win_width=640; 常数int win_高度=480; std::矢量颜色{win_width*win_height,glm::u8vec4{0,0,0}; SDL_Surface*render_Surface=SDL_CreateRGBSurfaceFrom(&colors[0]),宽度,高度,

我正在尝试为像素操作创建SDL_曲面,但是在设置曲面的颜色遮罩时出现了一些问题,因为填充颜色缓冲区时颜色不正确(请参阅注释,我正在尝试将u8vec4解释为RGBA颜色):

const int win_width=640;
常数int win_高度=480;
std::矢量颜色{win_width*win_height,glm::u8vec4{0,0,0};
SDL_Surface*render_Surface=SDL_CreateRGBSurfaceFrom(&colors[0]),宽度,高度,32,
sizeof(glm::u8vec4)*win_宽度,0xFF000000,0x00FF0000,0x0000FF00,0x000000FF);
SDL_纹理*render_纹理=SDL_CreateTexture(渲染器,SDL_像素格式\u RGBA8888,
SDL_TEXTUREACCESS_流媒体、win_宽度、win_高度);
//{255,0,0,255}=红色
//{255,0,0,100}=深红色,alpha似乎在工作
//{0,255,0,255}=紫色!?应该是绿色的吗?
//{0,0,255,255}=黄色,应为蓝色
std::fill(colors.begin()、colors.end()、glm::u8vec4{0,0,0,255});//红色
SDL_UpdateTexture(渲染纹理、nullptr、渲染曲面->像素、渲染曲面->基音);
SDL_渲染器(渲染器);
SDL_RenderCopy(渲染器、渲染_纹理、nullptr、nullptr);
SDL_渲染器呈现(渲染器);

您应该尝试根据endian设置bitmaks。我是这样做的:

#if SDL_BYTEORDER == SDL_BIG_ENDIAN
    const uint32_t R_MASK = 0xff000000;
    const uint32_t G_MASK = 0x00ff0000;
    const uint32_t B_MASK = 0x0000ff00;
    const uint32_t A_MASK = 0x000000ff;
#else
    const uint32_t R_MASK = 0x000000ff;
    const uint32_t G_MASK = 0x0000ff00;
    const uint32_t B_MASK = 0x00ff0000;
    const uint32_t A_MASK = 0xff000000;
#endif
在你的情况下,你得到了彩色面具的另一种方式


我认为Jongware是正确的,格式是ABGR

// { 255, 0, 0, 100 } = Darker red, alpha seems to be working
我猜这里的alpha看起来是正确的,因为背景是黑色的,通过将红色的数量减少到100,它会自然地与背景融合


我还认为您还没有设置

您应该尝试根据endian设置bitmaks。我是这样做的:

#if SDL_BYTEORDER == SDL_BIG_ENDIAN
    const uint32_t R_MASK = 0xff000000;
    const uint32_t G_MASK = 0x00ff0000;
    const uint32_t B_MASK = 0x0000ff00;
    const uint32_t A_MASK = 0x000000ff;
#else
    const uint32_t R_MASK = 0x000000ff;
    const uint32_t G_MASK = 0x0000ff00;
    const uint32_t B_MASK = 0x00ff0000;
    const uint32_t A_MASK = 0xff000000;
#endif
在你的情况下,你得到了彩色面具的另一种方式


我认为Jongware是正确的,格式是ABGR

// { 255, 0, 0, 100 } = Darker red, alpha seems to be working
我猜这里的alpha看起来是正确的,因为背景是黑色的,通过将红色的数量减少到100,它会自然地与背景融合


我还认为您还没有设置从右到左读取颜色值(ABGR),我可以想象它们会产生您描述的颜色。从右到左读取颜色值(ABGR),我可以想象它们会产生您描述的颜色。使用SDL_PIXELFORMAT_ABGR8888,这些遮罩(小端)和SDL_SetTextureBlendMode(…,SDL_BLENDMODE_BLENDMODE_BLENDMODE_BLENDMODE)使其工作。使用SDL_PIXELFORMAT_ABGR8888,这些遮罩(小端)和SDL_SetTextureBlendMode(…,SDL_BLENDMODE_BLEND)使其工作。