Подтвердить что ты не робот

Настройка целевых объектов OpenGL Multiple Render

Я видел много материала по этому вопросу, но есть некоторые различия между примерами, которые я нашел, и мне трудно найти правильное понимание правильного процесса. Надеюсь, кто-то может сказать мне, если я на правильном пути. Я также должен упомянуть, что я делаю это на OS X Snow Leopard и последней версии Xcode 3.

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

glGenFramebuffersEXT(1, &mFBO);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, mFBO);

glGenTextures(1, &mTexColor);
glBindTexture(GL_TEXTURE_2D, mTexColor);
//<texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, mTexColor, 0);

glGenTextures(1, &mTexNormal);
glBindTexture(GL_TEXTURE_2D, mTexNormal);
//<Texture params>
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, mTexNormal, 0);

glGenTextures(1, &mTexDepth);
glBindTexture(GL_TEXTURE_2D, mTexDepth);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, mTexDepth, 0);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)

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

GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
glDrawBuffers(2, buffers);

Это означало бы, что дальнейшие призывы рисования привлекут мой фреймбуфер. (Я думаю?)

Затем я установил свои шейдеры и нарисую сцену. В моем вершинном шейдере я обрабатывал нормали/позиции/цвета, как обычно, и передавал данные в шейдер фрагмента. Затем фрагмент будет делать что-то вроде:

gl_FragData[0] = OutputColor;
gl_FragData[1] = OutputNormal;

В этот момент у меня должно быть две текстуры; один с цветами из всех визуализированных объектов и один с нормалями. Все ли это правильно? Теперь я должен использовать эти текстуры, как и любые другие, скажем, чтобы они отображались на полноэкранном квадранте, правильно?

4b9b3361

Ответ 1

Звучит и выглядит разумно. Это действительно общий способ сделать это. Если вам не нужны данные глубины в качестве текстуры для дальнейшей обработки, вы также можете использовать renderbuffer для вложения, но текстура также должна работать нормально.

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