2011-02-25 65 views
3

在像素着色器中,您可以丢弃一个像素,但是我会想象即使是每个像素所需的快速故障着色器都需要一个不平凡的时间?有什么办法顶点着色器可以丢弃整个三角形...我相当确定VS 不能访问原语,但有什么技巧,我们可以得到相同的结果?是否可以使用顶点着色器渲染三角形?

在这里谈论SM 3.0 - 欢迎对新版本进行完整性讨论。

回答

1

几何着色器可以像你可能知道的那样平淡无奇,但在SM3中没有这样的事情。

由于顶点着色器看到的是单个顶点,因此顶点着色器难以识别三角形。但是......原则上这是可能的。

如果将w坐标设置为零,一个点将投影到无穷大。将所有点的w坐标设置为零,并且整个三角形处于无穷大,因此不会呈现。或者,你可以设置gl_ClipDistance为零或低于零的值(从来没有真正使用过这些,但我猜这应该可以)。这将标记顶点在裁剪平面“后面”。如果所有三个顶点都在裁剪平面之后,则三角形不可见。

您需要一种方法来识别属于您想要丢弃的三角形的顶点,但是......并且这并不容易,除非您有非常特殊的情况(例如知道您想要丢弃某些边界框中的所有三角形,或顶点属性#5为零的所有三角形,或其他)。

+0

有趣的想法。我的情况基本上是基于自定义切片平面(在着色器参数中传递)的每三次剔除。我们进行每像素测试,但是如果我们可以丢弃整个聚合物,那就太棒了。问题是,我猜从_a_顶点,如何知道其他2是否也在'错误'一侧。真的,我想在顶点上设置一些不起作用的属性,除非_all 3_顶点设置了它。 –

+0

但是,但是...不仅仅是一个用户剪辑平面呢?每个硬件上都应该支持一个定制的切片平面(我认为即使是5-6年前的卡片也可以支持4个左右的额外平面)。或者,甚至可以用“倾斜的近平面”黑客来完成。 – Damon

+0

@ dm.skt是的,它只是在像素级别(三角形被切片得到部分绘制)。您是否建议我们添加一个硬件剪辑平面,它将剔除整个多边形,然后只有那些至少部分可见的对象保留供像素着色器处理? –