有没有办法在OpenGL着色器中丢弃几何,顶点或片段?

Mak*_*gan 0 opengl shader glsl geometry-shader

我正在使用实例渲染来绘制大量的立方体.现在,显然立方体中可见面的最大数量是3,这意味着就着色而言,我所做的工作量是所需的两倍.

因为这是实例化,所以我不能简单地只传递要绘制到着色器的几何体.但是如果在着色器中(我想象这将是几何形状或细分)我可以使用普通信息来丢弃基元,我可以减少不必要的操作数量.

例如,如果观察方向和表面法线之间的角度小于90度,我可以假设在当前方向前面有一个三角形,因此丢弃了这个给定的图元.

在管道中是否有一种方法可以确定是否需要片段并相应地丢弃它?

Nic*_*las 5

在回答问题之前,让我先解决您的实际问题:使用背面剔除.为每个立方体的三角形赋予一致的顺序,这样当从正面看时,屏幕空间中面部的排序将是单向的,但是当从后面看时,顺序将是另一个.您选择的是一个由您自己决定的约定,但选择一个并保持一致.

然后使用glFrontFace告诉OpenGL哪个约定对你来说是"前面",并使用glEnable(GL_CULL_FACE)glCullFace(GL_BACK)告诉OpenGL剔除后向三角形.

这种剔除作为原始装配的一部分发生,因此它经过顶点处理后处理很久.

这就是你真正需要做的.哦,当然,你仍然需要花费一半的顶点处理三角形而不会被看到,但是如果你想要剔除它们,你仍然需要花时间搞清楚你是否想要剔除它们.请记住:GPU在锁定步骤中执行着色器调用.由于条件操作而剔除三角形/面/任何事情并不总能使任何事情更快,因为这些调用仍将继续执行.他们的结果将被抛弃.

面部剔除比你能编码的任何东西都高效得多.


现在,让我们回答实际问题:基于着色器的剔除有哪些选择?

您无法从顶点着色器中丢弃顶点.基元是基于特定的顶点计数(GL_TRIANGLES意味着每组3个顶点都是一个三角形),因此如果顶点被杀死,那将如何起作用是不起作用的.

您可以使用用户定义的剔除输出变量来仅从顶点着色器中剔除三角形.这类似于用户定义的剪裁平面,其中顶点着色器提供特殊的数字输出.对于削波,如果内插输出为正,则三角形的该部分是可见的; 当插值变为负值时,三角形的那部分通过削波变得不可见.

使用用户定义的剔除平面,如果特定基元的任何顶点具有剔除的负值,则整个基元被剔除.这允许一个着色器调用通过给出负剔除值来选择剔除它所处的原始状态.

曲面细分控制着色器能够丢弃补丁.如果补丁的TCS导致任何外部曲面细分级别的值为零,则他们正在处理的补丁将被曲面细分原语生成器剔除.

几何着色器当然可以根本不输出基元.