繁体   English   中英

在 OpenGL 中,实现不全部使用相同着色器的基元组合混合的最佳方法是什么?

[英]In OpenGL, what's the best way to achieve a combined blend of primitives that don't all use the same shader?

假设我有一堆半透明的三角形,我想将它们渲染为同一场景的一部分,并按深度顺序正确混合。 如果他们都使用相同的着色器(和相同的制服,OpenGL state 等),那么我所要做的就是在提交给 OpenGL 之前按深度对它们进行排序,然后我可以通过一次绘制调用来渲染它们。

但是,如果我想使用不同的着色器渲染一些三角形,我该怎么办? 因为有两个着色器,所以我不能再进行一次绘制调用了。 我是否分别对两组三角形进行排序并一个接一个地渲染它们? 但这仅在其中一组的深度值恰好小于另一组的深度值时才有效。 如果两组的深度值交错怎么办? 在最坏的情况下,如果两组三角形完美交错,那么在一组的每两个连续三角形之间,就有一个来自另一组的三角形? 那我该怎么办? 为了获得正确的结果,我是否必须执行与三角形一样多的绘制调用? 我想限制绘图调用的数量,因为我听说有很多绘图调用对性能不利。 有一个更好的方法吗?

在最坏的情况下,如果两组三角形完美交错,那么在一组的每两个连续三角形之间,就有一个来自另一组的三角形? 那我该怎么办? 为了获得正确的结果,我是否必须执行与三角形一样多的绘制调用?

是的,正是如此。

我想限制绘图调用的数量,因为我听说有很多绘图调用对性能不利。

当然,每个绘图调用都有相对较大的开销。 您可以在其中渲染场景的绘制调用越少,它就会越快。

有一个更好的方法吗?

当然,停止使用不同的着色器。 整个“不同的着色器”只是你的一个假设,我还没有看到它确实需要的证据。 在无绑定纹理、实例绘图、SSBO 和普通 ol 地图集之间,您必须渲染一些非常疯狂的三角形,而您不能只为所有它们编写一个着色器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM