【问题标题】:Saving a glTexImage2D to the file system for inspection将 glTexImage2D 保存到文件系统以供检查
【发布时间】:2019-10-02 01:06:58
【问题描述】:

我有一个 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)。

【问题讨论】:

  • 黑色是默认错误颜色,因此通常会为不支持的格式或不完整的纹理返回(例如未设置环绕模式)。
  • @Rabbid76:是的。谢谢你的帮助。刚刚将答案标记为已解决。

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


【解决方案1】:

如果要在 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);

这段代码sn-p中用到的所有函数都支持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也可以写入其他文件格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 2020-04-08
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    相关资源
    最近更新 更多