Как получить данные текстуры с использованием 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);
Другие вопросы по тегам