Сохранение glTexImage2D в файловую систему для проверки - PullRequest
1 голос
/ 15 мая 2019

У меня есть приложение для трехмерной графики, которое демонстрирует плохое поведение при текстурировании (в частности: конкретная текстура отображается черным цветом, когда этого не должно быть).Я выделил данные текстуры в следующем вызове:

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

Я проверил все значения в вызове и убедился, что они не NULL.Есть ли способ использовать все эти данные для сохранения в файловой системе (Linux) растрового изображения / png / некоторого видимого формата, чтобы я мог проверить текстуру, чтобы убедиться, что она не черная / что-то вроде мусора?Если это имеет значение, я использую OpenGL ES 2.0 (GLES2).

1 Ответ

1 голос
/ 15 мая 2019

Если вы хотите прочитать пиксели из изображения текстуры в 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 достаточно включить заголовочные файлы (связывать ничего не нужно):

#define STB_IMAGE_WRITE_IMPLEMENTATION
#include <stb_image_write.h>

Использовать stbi_write_bmp длязапись BMP-файла :

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

Обратите внимание, что также можно записывать другие форматы файлов по stbi_write_png, stbi_write_tga или stbi_write_jpg.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...