Настройка нескольких целей рендеринга OpenGL

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

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

23
задан TaylorP 26 August 2011 в 15:55
поделиться