我目前正在我的延迟渲染管道中实现骨骼动画。由于绑定网格中的每个顶点至少需要额外的 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
编写此代码时,我最初的想法是使用动画着色器绘制的内容只会覆盖以前的数据(假设深度较低),因为我没有清除深度或颜色缓冲区。这显然不是这样的。
如果有人知道如何解决这个问题,那就太好了!