我正在尝试使用模板缓冲区在模型后面绘制轮廓边框。
我正在使用2个渲染通道,首先渲染模型,然后使用GL_ALWAYS
将1
写入模具缓冲区,然后渲染使用GL_NOTEQUAL
和ref值为[[ C0],因此基本上只传递原始立方体之外的片段,从而突出显示。
我得到了奇怪的结果,轮廓没有完全渲染,当我移动相机足够多的时候,轮廓完全消失了,好像放大的立方体的模板测试根本没有通过。这是渲染循环的要点(shader3只是输出边框的颜色):
1
[我首先使用来自孤岛危机的while (!glfwWindowShouldClose(window))
{
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClearStencil(0);
renderer.Clear();
...
glm::mat4 projection = glm::perspective(glm::radians(45.0f), (float)SCREEN_WIDTH / (float)SCREEN_HEIGHT, 0.1f, 100.0f);
UniformMat4f projectionUniform("u_Projection");
projectionUniform.SetValues(projection);
glm::mat4 view = camera.GetView();
UniformMat4f viewUniform("u_View");
viewUniform.SetValues(view);
modelUniform.SetValues(glm::translate(glm::mat4(1.0f), glm::vec3(5.0f, 0.0f, 0.0f)));
shader1.SetUniform(projectionUniform);
shader1.SetUniform(viewUniform);
shader1.SetUniform(modelUniform);
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilMask(0xFF);
renderer.Draw(model, shader1);
modelUniform.SetValues(glm::scale(glm::translate(glm::mat4(1.0f), glm::vec3(5.0f, 0.0f, 0.0f)), glm::vec3(1.1f, 1.1f, 1.1f)));
shader3.SetUniform(projectionUniform);
shader3.SetUniform(viewUniform);
shader3.SetUniform(modelUniform);
glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
glStencilMask(0x00);
glDisable(GL_DEPTH_TEST);
renderer.Draw(model, shader3);
glEnable(GL_DEPTH_TEST);
}
模型进行了尝试,并且按照我描述的那样,它没有显示所有部件,并且在移动相机时最终消失了,因此它可以正常工作。我决定尝试使用简单的几何体对此进行测试,并尝试勾勒出简单的立方体并得到相同的结果:nanosuit
问题是在主循环末尾调用。模板掩码的默认值为glStencilMask(0x00);
(有关8位,请参见0xff
)。 OpenGL是一个状态引擎。状态会一直保留,直到再次更改为止(甚至超出帧数)。glStencilMask
考虑颜色,深度和模板遮罩的状态。如果模板掩码为glStencilMask
,则完全不清除模板缓冲区。