5

我正在使用 Cairo 渲染 SVG。Cairo 输出格式为 ARGB。然后我将渲染图像放在 SDL_Surface 中,这样我就可以将它用作 openGL 纹理。

当我直接使用 SDL_Surface 时,渲染的图像看起来很好。但是我不得不在 openGL 中使用表面作为纹理,因为我需要一些 openGL 函数。问题是,所有的颜色都被翻转了。OpenGL 使用 RGBA 而不是 ARGB。

我想知道是否有人可以帮助我将 SDL_Surface ARGB 转换为 RGBA。

有用信息:
我使用本教程来渲染我的 SVG。 http://tuxpaint.org/presentations/sdl_svg_svgopen2009_kendrick.pdf
我的软件是用 C 编写的。

编辑:我使用本教程将 SDL_Surface 用作 openGL 纹理。
http://www.sdltutorials.com/sdl-tip-sdl-surface-to-opengl-texture

渲染过程和opengl纹理都和教程一样。

4

1 回答 1

15

从您的 Tux 示例代码来看,您可以完全跳过 SDL,并使用以下代码手动向 OpenGL 提供像素数据:

GLuint tex;

glGenTextures (1, &tex);
glBindTexture (GL_TEXTURE_2D, tex);

glTexImage2D  (GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, image);

这里的重要细节是GL_BGRA像素数据的格式GL_UNSIGNED_INT_8_8_8_8_REV数据类型(这会在像素传输操作期间颠倒通道的顺序)。OpenGL 将负责将像素数据转换为适合您的纹素格式。另一方面,OpenGL ES 不会这样做。要使这个便携,您可能需要自己将像素数据转换为 RGBA 或 BGRA...

于 2013-09-05T01:40:15.150 回答