使用多个着色器写入帧缓冲区

Writing to Framebuffer using multiple shaders

我目前正在我的延迟渲染管道中实现骨骼动画。由于装配网格中的每个顶点至少需要额外的 32 个字节(由于骨骼的顶点 ID 和权重),我认为制作一个不同的着色器来负责绘制动画网格是个好主意。

也就是说,我有一个简单的几何缓冲区(帧缓冲区),它有 4 个颜色附件。这些颜色附件将使用我的静态几何着色器写入。 C++ 代码如下所示:

glDisable(GL_BLEND); 
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

glBindFramebuffer(GL_FRAMEBUFFER, gID); // Bind FBO
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(staticGeometryShaderID); // Bind static geometry shader

// Pass uniforms & draw static meshes here

glBindFramebuffer(GL_FRAMEBUFFER, 0); // Unbind FBO

上面的代码运行正常。问题是当我尝试将我的动画着色器添加到混合中时。以下代码是我目前使用的:

glDisable(GL_BLEND); 
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);

glBindFramebuffer(GL_FRAMEBUFFER, gID); // Bind FBO
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glUseProgram(staticGeometryShaderID); // Bind static geometry shader

// Pass uniforms & draw static meshes here

glUseProgram(animationShaderID); // Bind animated geometry shader

// Pass uniforms & draw animated meshes here

glBindFramebuffer(GL_FRAMEBUFFER, 0); // Unbind FBO

上面的例子与上一个例子相同,只是在绘制静态几何体后绑定了另一个着色器,它会尝试绘制动画几何体。请记住,静态几何着色器和动画几何着色器是完全相同的(除了根据骨骼变换变换顶点的动画顶点着色器)。

这段代码的结果是正在绘制我的动画网格,不仅针对当前帧,还针对所有之前的帧。结果看起来像这样:https://gyazo.com/fef2faccbfd03377c0ffab3f9a8cb8ec

我在编写这段代码时最初的想法是,使用动画着色器绘制的东西只会覆盖以前的数据(假设深度较低),因为我没有清除深度或颜色缓冲区。显然不是这样。

如果有人知道如何解决这个问题,那就太好了!

原来我没有清除渲染提交的矢量,所以我添加了一个新的网格来绘制每一帧。