使用模板缓冲区概述对象会产生错误的结果

问题描述 投票:1回答:1

我正在尝试使用模板缓冲区在模型后面绘制轮廓边框。

我正在使用2个渲染通道,首先渲染模型,然后使用GL_ALWAYS1写入模具缓冲区,然后渲染使用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

c++ opengl shader glfw stencil-buffer
1个回答
0
投票

问题是在主循环末尾调用enter image description here。模板掩码的默认值为glStencilMask(0x00);(有关8位,请参见0xff)。 OpenGL是一个状态引擎。状态会一直保留,直到再次更改为止(甚至超出帧数)。glStencilMask考虑颜色,深度和模板遮罩的状态。如果模板掩码为glStencilMask,则完全不清除模板缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.