glStencilFunc由于某种原因无法工作:(

时间:2011-11-10 23:32:40

标签: opengl buffer stencil-buffer

无论我尝试了什么,粒子都会在地球外部渲染而不会触及地球内部,我想要反过来!无论我改变了什么参数(尝试了2个小时),它的任何一个粒子都在外面精细但不在内部,或在外部和内部都是粒子。我对此感到非常头疼,有人可以帮我解决这个问题。我使用1位用于模板缓冲器。 GDEbugger显示模板缓冲区工作正常。

glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NEVER, 1, 1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);
globe->Use();
globe->SetWVP(&WVP, true);
Render(globe.obj");
glDisable(GL_STENCIL_TEST);

glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

RenderParticlesUsingTransformFeedback();

2 个答案:

答案 0 :(得分:5)

在渲染粒子之前,您正在禁用模板测试。

答案 1 :(得分:1)

glDisable(GL_STENCIL_TEST);

如果你想让RenderParticlesUsingTransformFeedback对模板缓冲区进行实际测试,你必须实际使用它。另外,我假设" UsingTransformFeedback" part表示您之前使用TF生成了这些粒子。因为模板不会剔除三角形,所以它不会影响变换反馈的数据生成。

在任何情况下,您的模板代码都无法正常工作,因为无法工作。您不能仅使用模板缓冲区来确保粒子不会在三维体积之外渲染。您可以在2D卷之外执行此操作。如果你不介意渲染球体后面的物体,你可以部分地为3D体积之外的粒子做这件事。

但是如果你想将它限制为3D音量,你将不得不使用一些着色器逻辑,而不是模板缓冲器。您必须保持3D体积的最近点,但您还需要最远点。所以你需要做一些有趣的深度缓冲诡计。

渲染粒子时,需要使用用于捕获近端和远端值的两个深度缓冲区。然后,在着色器中,如果当前深度超出该范围,则丢弃该片段。