Opengl glStencilFunc因某些原因无法工作:(

Opengl glStencilFunc因某些原因无法工作:(,opengl,buffer,stencil-buffer,Opengl,Buffer,Stencil Buffer,无论我尝试了什么,粒子都会在球体外部渲染,而不会触及球体内部,我希望它以另一种方式渲染!无论我更改了什么参数(尝试了2小时),它的粒子呈现外部精细但内部不精细,或者外部和内部的粒子。我对此感到非常头痛,有人能帮我解决这个错误吗。我正在使用1位的模具缓冲区。GDEbugger显示模具缓冲区工作良好 glEnable(GL_STENCIL_TEST); glStencilFunc(GL_NEVER, 1, 1); glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPL

无论我尝试了什么,粒子都会在球体外部渲染,而不会触及球体内部,我希望它以另一种方式渲染!无论我更改了什么参数(尝试了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();

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

您正在渲染粒子之前禁用模具测试

glDisable(GL_STENCIL_TEST);
如果您想让使用TransformFeedback的
RenderParticles实际测试模具缓冲区,您必须实际使用该缓冲区。此外,我假设“UsingTransformFeedback”part表示您以前使用TF生成了这些粒子。因为模板绘制不会剔除三角形,所以不会影响使用变换反馈生成数据

在任何情况下,您的模具代码都无法工作,因为它无法工作。您不能仅使用模具缓冲区来确保粒子不会在三维体积之外渲染。您可以在二维体积之外进行渲染。如果您不介意球体后面的对象被重新渲染,您也可以对三维体积之外的粒子进行部分渲染安得雷德

但如果你想将其限制在3D体积内,你必须使用一些着色器逻辑,而不是模具缓冲区。你必须保持3D体积的最近点,但你也需要最远点。因此你需要做一些有趣的深度缓冲区把戏

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

如果您想让使用TransformFeedback的
RenderParticles实际测试模具缓冲区,您必须实际使用该缓冲区。此外,我假设“UsingTransformFeedback”part表示您以前使用TF生成了这些粒子。因为模板绘制不会剔除三角形,所以不会影响使用变换反馈生成数据

在任何情况下,您的模具代码都无法工作,因为它无法工作。您不能仅使用模具缓冲区来确保粒子不会在三维体积之外渲染。您可以在二维体积之外进行渲染。如果您不介意球体后面的对象被重新渲染,您也可以对三维体积之外的粒子进行部分渲染安得雷德

但如果你想将其限制在3D体积内,你必须使用一些着色器逻辑,而不是模具缓冲区。你必须保持3D体积的最近点,但你也需要最远点。因此你需要做一些有趣的深度缓冲区把戏


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

哇,你刚刚解决了我的问题,我简直不敢相信我有多傻。我会给你+1,但我不能,因为我的代表太低了:(哇,你刚刚解决了我的问题,我简直不敢相信我有多愚蠢。我会给你+1,但我不能,因为我的代表太低了:(