将glTexImage2D保存到文件系统以进行检查

时间:2019-05-14 23:43:52

标签: c++ c opengl-es

我有一个3D图形应用程序,它表现出不良的纹理表现(特别是:特定的纹理在不应该出现时显示为黑色)。我在以下调用中隔离了纹理数据:

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, fmt->gl_type, data)

我已经检查了呼叫中的所有值,并确认它们不是NULL。有没有一种方法可以使用所有这些数据将bitmap / png /某种可见格式保存到(Linux)文件系统,以便我可以检查纹理以确认它不是黑色的/某种垃圾?如果我使用的是OpenGL ES 2.0(GLES2),这很重要。

1 个答案:

答案 0 :(得分:0)

如果要从OpenGL ES中的纹理图像读取像素,则必须将纹理附加到帧缓冲区,并通过glReadPixels

从帧缓冲区中读取颜色平面。
GLuint textureObj = ...; // the texture object - glGenTextures  

GLuint fbo;
glGenFramebuffers(1, &fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureObj, 0);

int data_size = mWidth * mHeight * 4;
GLubyte* pixels = new GLubyte[mWidth * mHeight * 4];
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteFramebuffers(1, &fbo);

此代码段中所有使用的功能受OpenGL ES 2.0支持。

请注意,在桌面OpenGL中有glGetTexImage,可用于从纹理读取像素数据。 OpenGL ES中不存在此功能。

要将图像写入文件(在c ++中),我建议使用STB library之类的库,可以在GitHub - nothings/stb中找到该库。

要使用STB library库,只需包含头文件(不必链接任何文件)即可:

#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <stb_image_write.h>

使用stbi_write_bmp编写一个BMP file

stbi_write_bmp( "myfile.bmp", width, height, 4, pixels );

请注意,也可以用stbi_write_pngstbi_write_tgastbi_write_jpg编写其他文件格式。