Как получить данные текстуры с использованием textureID в openGL
Я пишу некоторый код, к которому у меня есть доступ - это textureID, чтобы получить доступ к необходимой текстуре. Есть ли какой-нибудь способ, которым я могу получить доступ к значениям RGB этой текстуры, чтобы я мог выполнить некоторые вычисления на ней?
РЕДАКТИРОВАТЬ: я ищу обратное glTexSubImage2D
, Я хочу получить данные текстуры, а не заменить их.
3 ответа
Вы, вероятно, ищете glGetTexImage
(см. https://www.khronos.org/opengl/wiki/GLAPI/glGetTexImage для получения дополнительной информации).
Перед использованием glGetTexImage
не забудьте использовать glBindTexture
( https://www.khronos.org/opengl/wiki/GLAPI/glBindTexture) с вашим идентификатором текстуры.
В OpneGL текстуру можно прочитать glGetTexImage
/glGetnTexImage
соответственно версия функции DSA glGetTextureImage
.
Другая возможность - прикрепить текстуру к фреймбуферу и прочитать пиксель с помощью glReadPixels
. OpenGL ES не предлагаетglGetTexImage
, так что это путь к OpenGL ES.
См. Альтернативу opengl es 2.0 android C++ glGetTexImage
Если вы переносите изображение текстуры в объект пиксельного буфера, вы даже можете получить доступ к данным через сопоставление объекта буфера. См. Также OpenGL Pixel BufferObject (PBO).
Вы должны привязать буфер нужного размера к целиGL_PIXEL_PACK_BUFFER
:
// create buffer
GLuint pbo;
glGenBuffers(1, &pbo);
glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
glBufferData(GL_PIXEL_PACK_BUFFER, size_in_bytes, 0, GL_STATIC_READ);
// get texture image
glBindTexture(GL_TEXTURE_2D, texture_obj);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)(0));
// map pixel buffer
void * data_ptr = glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
// access the data
// [...]
glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
Я пишу это здесь на всякий случай, если это кому-то понадобится.
В OpenGL версии 4.5+ можно получить доступ к данным текстуры, идентификатор текстуры с помощью функции указавglGetTextureImage() .
Например, чтобы получить данные текстуры GL_RGB, у нас есть 3 числа с плавающей запятой R, G, B, каждое из которых имеет размер 4 байта, поэтому:
float* data = new float[texture_height * texture_width * 3];
glGetTextureImage(textureID, 0, GL_RGB, GL_FLOAT, texture_height * texture_width * 3 * 4, data);