2015-05-04 1 views
5

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

Я понимаю, что я могу делать эти две вещи отдельно, в двух вызовах glDraw * (один рендеринг для FBO, один нет), который будет использовать две соответствующие шейдерные программы.

И я думаю, что (все еще учусь об этом), я могу сделать их в основном одновременно, путем присоединения двух renderbuffers/текстур на один FBO, делая один glDraw * называют одним шейдерной программы которого пиксельный шейдер будет писать соответствующие значения для нескольких выходы, соответствующие множеству вложений FBO, и, наконец, копирование одного из двух изображений в FBO в фреймбуфер по умолчанию, используя его для текстурирования квадрата заполнения сцены или вызова glBlitFramebuffer.

Но могу ли я сделать один вызов glDraw * с помощью одной шейдерной программы, а мой шейдер фрагментов напишите как на видимый фреймбуфер, так и на внеэкранный FBO? Я не подозреваю, что я видел соответствующую документацию, но я не уверен.

ответ

5

Нет, вы не можете рисовать в разные фреймбуферы одновременно. Но вы можете рисовать разные буферы рисования, привязанные к фреймбуферу. Это возможно и называется несколькими объектами рендеринга.

Вы должны указать ничью буферов таким образом:

GLenum DrawBuffers[] = 
{ 
    GL_COLOR_ATTACHMENT0, 
    GL_COLOR_ATTACHMENT1, 
    GL_COLOR_ATTACHMENT2, 
    GL_COLOR_ATTACHMENT3 
}; 
glDrawBuffers(ARRAY_SIZE_IN_ELEMENTS(DrawBuffers), DrawBuffers); 

Затем в пиксельный шейдер, вы должны написать что-то вроде:

layout (location = 0) out vec3 WorldPosOut; 
layout (location = 1) out vec3 DiffuseOut; 
layout (location = 2) out vec3 NormalOut; 
layout (location = 3) out vec3 TexCoordOut; 

uniform sampler2D gColorMap; 

void main() 
{ 
    WorldPosOut = WorldPos0; 
    DiffuseOut = texture(gColorMap, TexCoord0).xyz; 
    NormalOut = normalize(Normal0); 
    TexCoordOut = vec3(TexCoord0, 0.0); 
} 

выходных значений Это позволит всем сделать буферы на один раз. Обратитесь к http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html за полным примером.