gpt4 book ai didi

c++ - 将 SDL_Surface Blit 到另一个 SDL_Surface 并应用颜色键

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:07 26 4
gpt4 key购买 nike

我想将 SDL_Surface 加载到带有填充的 OpenGL 纹理中(以便 NPOT->POT),然后在表面上应用颜色键。我要么最终对所有像素进行颜色键控,不管它们的颜色如何,要么根本不对任何颜色进行颜色键控。我尝试了很多不同的方法,但似乎都不起作用。

这是我的代码的工作片段。我为颜色键(范围 [0-1])使用自定义颜色类:

// Create an empty surface with the same settings as the original image
SDL_Surface* paddedImage = SDL_CreateRGBSurface(image->flags, width, height,
image->format->BitsPerPixel,
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
0xff000000,
0x00ff0000,
0x0000ff00,
0x000000ff
#else
0x000000ff,
0x0000ff00,
0x00ff0000,
0xff000000
#endif
);
// Map RGBA color to pixel format value
Uint32 colorKeyPixelFormat = SDL_MapRGBA(paddedImage->format,
static_cast<Uint8>(colorKey.R * 255),
static_cast<Uint8>(colorKey.G * 255),
static_cast<Uint8>(colorKey.B * 255),
static_cast<Uint8>(colorKey.A * 255));

SDL_FillRect(paddedImage, NULL, colorKeyPixelFormat);

// Blit the image onto the padded image
SDL_BlitSurface(image, NULL, paddedImage, NULL);

SDL_SetColorKey(paddedImage, SDL_SRCCOLORKEY, colorKeyPixelFormat);

然后,我使用类似于在线找到的 SDL+OpenGL 纹理加载代码的代码从 paddedImage 生成 OpenGL 纹理(如有必要,我会发布)。如果我只想要带或不带填充的纹理,则此代码有效,并且可能不是问题所在。

我意识到我将 paddedImage 中的所有像素设置为 alpha 零,这导致了我提到的第一个问题,但我似乎无法弄清楚如何做到这一点。我是否应该只遍历像素并将适当的颜色设置为具有 alpha 零?

部分解决方案:

  1. 如上创建paddedImage
  2. SDL_FillRect 带有颜色键的 paddedImage
  3. “像往常一样”生成纹理
  4. 手动复制图像(SDL_Surface*)像素到paddedImage(OGL纹理)

这几乎总是适用于某些图像具有 3 个颜色分量(即没有 alpha channel )的情况。我现在正尝试通过将它们转换为 4 个颜色分量来解决这个问题

最佳答案

我认为它可以与 OpenGL 一起使用,如果你可以将 SDL_Surface 转换为 OGL 纹理,然后你可以使用 blit 函数来组合你的纹理,并使用 SDL 工作流操作事物.我不知道你想达到什么目的。您想要将一个表面转移到 OGL 纹理并保留色键,或者只是想将色键化表面应用到另一个表面,然后将其转换为 OGL 纹理。此外,您不必使用每像素 alpha,因为 SDL 使您能够使用每表面 alpha,但它非常复杂,因为哪些 alpha 和颜色键可以组合在一起使用。

因为这是一件复杂的事情,请引用 SDL 引用,本教程也可能有帮助(虽然它不处理 OGL 内容): http://www.sdltutorials.com/the-ins-and-outs-and-overlays-of-alpha-blending

关于c++ - 将 SDL_Surface Blit 到另一个 SDL_Surface 并应用颜色键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9525174/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com