Я видел много материала по этому вопросу, но есть некоторые различия между примерами, которые я нашел, и мне трудно найти правильное понимание правильного процесса. Надеюсь, кто-то может сказать мне, если я на правильном пути. Я также должен упомянуть, что я делаю это на 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;
В этот момент у меня должно быть две текстуры; один с цветами из всех визуализированных объектов и один с нормалями. Все ли это правильно? Теперь я должен использовать эти текстуры, как и любые другие, скажем, чтобы они отображались на полноэкранном квадранте, правильно?