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

Posted

技术标签:

【中文标题】glStencilFunc 由于某种原因无法工作:(【英文标题】:glStencilFunc not working for some reason :( 【发布时间】:2011-11-10 23:32:40 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

哇,你刚刚解决了我的问题,我不敢相信我是多么愚蠢。我会给你+1,但我不能因为我的代表太低:(【参考方案2】:
glDisable(GL_STENCIL_TEST);

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

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

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

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

【讨论】:

以上是关于glStencilFunc 由于某种原因无法工作:(的主要内容,如果未能解决你的问题,请参考以下文章

classList.remove 和 .add 由于某种原因无法正常工作

C# 代表。铸造由于某种原因无法正常工作

GROUP CONCAT 由于某种原因无法正常工作

random.choice()由于某些原因无法工作。

CSS媒体查询由于某种原因不起作用

活动记录由于某种原因无法保存