Как переключиться между рендерингом и представлением кадровых буферов в iPhone OpenGL ES 2.0? - PullRequest
2 голосов
/ 04 февраля 2011

iPhone OpenGL ES 2.0 ..

  • Первый кадр, рендеринг в мой кадровый буфер, а затем представить его (как это работает по умолчанию в шаблоне приложения OpenGL ES).
  • В следующем кадре я хочу использовать этот визуализированный кадровый буфер в качестве входных данных для моих шейдеров при рендеринге в другой кадровый буфер и представлении этого второго кадрового буфера.
  • В следующем кадре я хочу использовать framebuffer2 в качестве входных данных для моих шейдеров при повторной визуализации в первый кадровый буфер.
  • Повторите

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

1 Ответ

9 голосов
/ 04 февраля 2011

Вы должны иметь возможность настроить рендер-буфер с текстурой, поддерживающей его, используя следующий код:

// Offscreen position framebuffer object
glGenFramebuffers(1, &positionFramebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, positionFramebuffer);

glGenRenderbuffers(1, &positionRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, positionRenderbuffer);

glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, FBO_WIDTH, FBO_HEIGHT);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, positionRenderbuffer); 

// Offscreen position framebuffer texture target
glGenTextures(1, &positionRenderTexture);
glBindTexture(GL_TEXTURE_2D, positionRenderTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, FBO_WIDTH, FBO_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

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

Переключение буферов так же просто, как использовать код, подобный следующему:

glBindFramebuffer(GL_FRAMEBUFFER, positionFramebuffer);        
glViewport(0, 0, FBO_WIDTH, FBO_HEIGHT);

Затем вы можете выполнить рендеринг в этот буфер и отобразить полученную текстуру, передав ее в простой шейдер, который отображает ее в виде прямоугольного фрагмента геометрии.Эта текстура также может быть передана в шейдер, который рендерится в другой аналогичный буфер визуализации, который поддерживается текстурой и т. Д.* чтобы извлечь пиксели из этого закадрового буфера рендеринга.

В качестве примеров вы можете попробовать мои примеры приложений здесь и здесь .Первый из них выполняет обработку видеокадров с камеры, при этом одна из настроек позволяет передавать видео во время обработки в закадровом буфере рендеринга.Последний пример рендерится в текстуру карты куба в одной точке, а затем использует эту текстуру для отображения окружения на чайнике.

...