0

我目前正在我的延迟渲染管道中实现骨骼动画。由于绑定网格中的每个顶点至少需要额外的 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

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

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

4

1 回答 1

0

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

于 2022-02-23T17:22:00.947 回答