如果您想在一个中写入多个渲染目标片段着色器 https://www.khronos.org/opengl/wiki/Fragment_Shader,那么你必须声明多个output https://www.khronos.org/opengl/wiki/Fragment_Shader#Outputs变量:
#version 330
layout(location = 0) out vec4 fragData0;
layout(location = 1) out vec4 fragData1;
void main()
{
fragData0 = vec4(1.0, 1.0, 1.0, 1.0);
fragData1 = vec4(0.0, 0.0, 0.0, 1.0);
}
从 GLSL 版本 1.1 开始(#version 110
, OpenGL 2.0) 到 GLSL 版本 1.5 (#version 150
,OpenGL 3.2),通过写入内置片段着色器输出变量可以实现相同的效果gl_FragData
.
void main()
{
gl_FragData[0] = vec4(1.0, 1.0, 1.0, 1.0);
gl_FragData[1] = vec4(0.0, 0.0, 0.0, 1.0);
}
也可以看看片段着色器输出 - 历代以来 https://io7m.com/documents/fso-tta/
要在 Qt 中使用多个渲染目标,必须将第二个颜色附件添加到帧缓冲区,并且必须通过以下方式指定颜色缓冲区列表glDrawBuffers https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawBuffers.xhtml:
QOpenGLShaderProgram *program;
QOpenGLFramebufferObject *fb;
int fb_width;
int fb_height,
fb = new QOpenGLFramebufferObject( fb_width, fb_height );
fb->addColorAttachment( fb_width, fb_height );
glViewport(0, 0, fb_width, fb_height);
fb->bind();
glClearColor(0, 0, 0, 1);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
glDrawBuffers(2, buffers);
program->bind();
// ..... do the drawing
program->release();
fb->release();
可以访问附加到帧缓冲区的 OpenGL 纹理对象:
QVector<GLuint> fb_textrues = fb->textures();