将 glTexImage2D 保存到文件系统以供检查
Saving a glTexImage2D to the file system for inspection
我有一个 3D 图形应用程序表现出不良的纹理行为(特别是:特定纹理显示为黑色,而本不该显示为黑色)。我在以下调用中隔离了纹理数据:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, fmt->gl_type, data)
我检查了调用中的所有值并确认它们不是 NULL
。有没有办法使用所有这些数据将 bitmap/png/some 可视格式保存到 (Linux) 文件系统,以便我可以检查纹理以验证它不是 black/some 类型垃圾?重要的是我使用的是 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, which can be found at GitHub - nothings/stb 这样的库。
要使用 STB library 库,包含头文件就足够了(不需要 link 任何东西):
#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_png
、stbi_write_tga
或stbi_write_jpg
写入其他文件格式。
我有一个 3D 图形应用程序表现出不良的纹理行为(特别是:特定纹理显示为黑色,而本不该显示为黑色)。我在以下调用中隔离了纹理数据:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, fmt->gl_type, data)
我检查了调用中的所有值并确认它们不是 NULL
。有没有办法使用所有这些数据将 bitmap/png/some 可视格式保存到 (Linux) 文件系统,以便我可以检查纹理以验证它不是 black/some 类型垃圾?重要的是我使用的是 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, which can be found at GitHub - nothings/stb 这样的库。
要使用 STB library 库,包含头文件就足够了(不需要 link 任何东西):
#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_png
、stbi_write_tga
或stbi_write_jpg
写入其他文件格式。