0

无论我尝试什么,粒子在地球外部渲染而不会触及地球内部,我希望它反过来!无论我更改了哪些参数(尝试了 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();
4

2 回答 2

5

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

于 2011-11-10T23:44:57.440 回答
1
glDisable(GL_STENCIL_TEST);

如果您想RenderParticlesUsingTransformFeedback针对模板缓冲区进行实际测试,则必须实际使用它。另外,我假设“UsingTransformFeedback”部分意味着您之前使用 TF 生成了这些粒子。因为模板不剔除三角形,所以不会影响带有变换反馈的数据的生成。

在任何情况下,您的模板代码都不起作用,因为它不起作用。您不能仅使用模板缓冲区来确保粒子不会渲染到三维体积之外。您可以在 2D 体积之外执行此操作。如果您不介意球体后面的对象被渲染,您可以部分地为 3D 体积之外的粒子执行此操作。

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

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

于 2011-11-11T00:01:03.440 回答