c++ - SDL2 纹理的像素格式和表面颜色 mask

标签 c++ sdl sdl-2

我正在尝试创建一个用于像素操作的 SDL_Surface,但是在设置表面的颜色掩码时确实出了点问题,因为填充颜色缓冲区时颜色不正确(请参阅评论,我正在尝试解释u8vec4 作为 RGBA 颜色):

const int win_width = 640;
const int win_height = 480;
std::vector<glm::u8vec4> colors{ win_width * win_height, glm::u8vec4{ 0, 0, 0, 0 } };

SDL_Surface* render_surface = SDL_CreateRGBSurfaceFrom(&colors[0], win_width, win_height, 32,
    sizeof(glm::u8vec4) * win_width, 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);

SDL_Texture* render_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, 
    SDL_TEXTUREACCESS_STREAMING, win_width, win_height);

// { 255, 0, 0, 255 } = Red
// { 255, 0, 0, 100 } = Darker red, alpha seems to be working
// { 0, 255, 0, 255 } = Purple!? Should be green?
// { 0, 0, 255, 255 } = Yellow, expecting blue
std::fill(colors.begin(), colors.end(), glm::u8vec4{ 0, 0, 0, 255 }); // Red
SDL_UpdateTexture(render_texture, nullptr, render_surface->pixels, render_surface->pitch);
SDL_RenderClear(renderer);
SDL_RenderCopy(renderer, render_texture, nullptr, nullptr);
SDL_RenderPresent(renderer);

最佳答案

你应该尝试根据字节序设置你的 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,它会自然地融入背景。

我还认为你没有设置SDL_BlendMode

关于c++ - SDL2 纹理的像素格式和表面颜色 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959896/

相关文章:

c++ - 在 C++ 中,将 friend 添加到类中会改变其内存布局吗?

c++ - 在SDL_ttf中使用UTF8渲染字体

c - 如何正确释放SDL_ttf分配的资源?

c++ - 使用 SDL2 播放正弦声波 - 噪音/抓取问题

c++ - 库、DLL 和 .h 文件

c++ - 在 BOOST_FOREACH 循环中访问迭代器

c++ - Android on Samsung s5230 star (for C++)

c++ - 将指向成员函数的指针作为指向函数的指针传递

c++ - 从 SDL_Surface 读取像素并转换为颜色值

c++ - 样本 SDL 程序给出一个空窗口