Масштабирование текстуры OpenGL и возврат растрового изображения в память процессора - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть текстура на графическом процессоре, определенная фактурой OpenGL и целевым объектом.

Мне нужно для дальнейшей обработки растрового изображения 300 пикселей в памяти ЦП (ширина 300 пикселей, высота пропорциональна в зависимости от ширины источника).

Пиксельный формат должен быть RGBA, ARGB или BGRA с плавающими компонентами.

Как это можно сделать?

Спасибо за ваш ответ.

Iпопробовал следующее.Но я получаю только белые пиксели назад:

glEnable(GL_TEXTURE_2D);

// create render texture
GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, (GLsizei)analyzeWidth, (GLsizei)analyzeHeight, 0,GL_RGBA, GL_FLOAT, 0);

unsigned int fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderedTexture, 0);

// draw texture
glBindTexture(GL_TEXTURE_2D, inTextureId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

// Draw a textured quad
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(0, 0, 0);
glTexCoord2f(0, 1); glVertex3f(0, 1, 0);
glTexCoord2f(1, 1); glVertex3f(1, 1, 0);
glTexCoord2f(1, 0); glVertex3f(1, 0, 0);
glEnd();

GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if(status == GL_FRAMEBUFFER_COMPLETE)
{

}

unsigned char *buffer = CGBitmapContextGetData(mainCtx);
glReadPixels(0, 0, (GLsizei)analyzeWidth, (GLsizei)analyzeHeight, GL_RGBA, GL_FLOAT, buffer);

glDisable(GL_TEXTURE_2D);
glBindFramebuffer(GL_FRAMEBUFFER, 0); //

glDeleteFramebuffers(1, &fbo);

1 Ответ

0 голосов
/ 10 декабря 2018
  1. Создайте вторую текстуру с размером 300*width/height x 300
  2. Создайте объект Framebuffer и присоедините новую текстуру в качестве цветового буфера.
  3. Установите соответствующие текстурные фильтры для (немасштабированной) исходной текстуры.У вас есть выбор между точечной выборкой (GL_NEAREST) и билинейной фильтрацией (GL_LINEAR).Если вы уменьшаете масштаб более чем в 2 раза, вы можете также рассмотреть возможность использования mipmapping и, возможно, захотите сначала вызвать glGenerateMipmap на исходной текстуре и использовать один из минимизирующих фильтров GL_..._MIPMAP_....Однако доступность mipmapping будет зависеть от того, как была создана исходная текстура. Если это неизменный текстурный объект без пирамиды mipmap, это не сработает.
  4. Визуализация текстурированного объекта (с исходной текстурой источника).) к новой текстуре.Наиболее интуитивной геометрией будет прямоугольник, заполняющий область просмотра, наиболее эффективным будет один треугольник.
  5. Считайте масштабированную текстуру с помощью glReadPixels (через FBO) или glGetTexImage (прямо из текстуры).Для повышения производительности вы можете рассмотреть асинхронные обратные вызовы через объекты пиксельного буфера .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...