如何在OpenGL/SDL中使用ARGB颜色?

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纹理都与教程相同。

你需要向我们展示你的OpenGL代码。 - Luka Horvat
“然后我将渲染出的图像放入SDL_Surface中,这样我就可以将其用作OpenGL纹理。” 你知道OpenGL有上传纹理数据的函数,对吧?你不必使用SDL来完成它。 - Nicol Bolas
我可以在Cairo中渲染SVG并直接应用于OpenGL纹理吗?那将是最好的选择。@Luka,代码相当大,我认为tuxpaint的链接足以说明情况,因为渲染到表面的方式完全相同。但问题在于Cairo使用ARGB。我认为我无法做太多关于它的事情。 - user1586263
1个回答

16
根据您的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格式...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接