c++ - 将 glTexImage2D 保存到文件系统以供检查

标签 c++ opengl-es textures opengl-es-2.0 framebuffer

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

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

我检查了调用中的所有值并验证它们不是 NULL。有没有办法使用所有这些数据将位图/png/某种可视格式保存到(Linux)文件系统,以便我可以检查纹理以验证它不是黑色/某种垃圾?这很重要,我使用的是 OpenGL ES 2.0 (GLES2)。

最佳答案

如果您想从 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_bmpBMP file :

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

请注意,也可以通过stbi_write_pngstbi_write_tgastbi_write_jpg写入其他文件格式。

关于c++ - 将 glTexImage2D 保存到文件系统以供检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56140002/

相关文章:

android - 在 Android 中加载压缩纹理 ETC1

c++ - 程序开始信号 Qt C++

c++ - QOpenGLtexture层数

c++ - opencv grabcut 保存结果

ios - 在 OpenGL ES 中渲染两个对象

ios - iPad2 复制 1K 图像需要 0.5 秒——这是我能做的最好的吗?

c++ - C++ 中的值访问

objective-c - 有什么巧妙的解决方案可以将资源包含在静态库中?

ios - 将原始数据转换为适用于 iOS 的可显示视频

c# - 在 Unity 中使 Material 透明