Shader 是否可以使用顶点着色器从渲染中删除三角形?

Shader 是否可以使用顶点着色器从渲染中删除三角形?,shader,vertex-shader,Shader,Vertex Shader,在像素着色器中,您可以丢弃一个像素,但我可以想象,即使为每个像素调用一个快速失败着色器,也会花费大量时间?顶点着色器是否可以丢弃整个三角形。。。我相当肯定VS不能访问原语,但是有没有什么技巧可以让我们得到相同的结果 这里讨论的是SM 3.0-为了完整性,欢迎对较新版本进行讨论。几何体着色器可以做到这一点,正如您可能知道的,但在SM3中没有这样的事情 顶点着色器很难识别三角形本身,因为顶点着色器只能看到单个顶点。但是原则上这是可能的 如果将w坐标设置为零,则点将投影到无穷远。将所有点的w坐标设置为

在像素着色器中,您可以丢弃一个像素,但我可以想象,即使为每个像素调用一个快速失败着色器,也会花费大量时间?顶点着色器是否可以丢弃整个三角形。。。我相当肯定VS不能访问原语,但是有没有什么技巧可以让我们得到相同的结果


这里讨论的是SM 3.0-为了完整性,欢迎对较新版本进行讨论。

几何体着色器可以做到这一点,正如您可能知道的,但在SM3中没有这样的事情

顶点着色器很难识别三角形本身,因为顶点着色器只能看到单个顶点。但是原则上这是可能的

如果将w坐标设置为零,则点将投影到无穷远。将所有点的w坐标设置为零,则整个三角形为无穷大,因此不会渲染

或者,您可以将gl_ClipDistance设置为零或设置为零以下的值(从未真正使用过这些值,但我想这应该是可行的)。这会将顶点标记为剪裁平面的“后面”。如果所有三个顶点都位于剪裁平面后面,则三角形不可见


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

有趣的想法。我的案例基本上是基于自定义切片平面(在着色器参数中传递)的逐三次消隐。我们做每像素测试,但如果我们可以删除整个多边形,那就太好了。问题是,我想,从一个顶点,如何知道另外两个是否也在“错误”的一边。我真的想在顶点上设置一些属性,除非所有3个顶点都设置了,否则这些属性没有任何效果。。。那不是一个简单的用户剪辑平面吗?几乎每个硬件上都应该支持一个自定义切片平面(我认为5-6年前用于支持4个左右额外平面的卡)。或者,它可能甚至可以通过“斜近平面”黑客来完成。@dm.skt是的,但在像素级(被切片的三角形得到部分绘制)。你是不是建议我们添加一个硬件剪辑平面来剔除整个多边形,然后只有那些至少部分可见的多边形保留供像素着色器处理?那么剪辑(使用硬件剪辑平面或对着截锥体,同样)的作用是:a)如果整个三角形是“in”,则什么都不做,b)通过三角形切片,引入一条新边,如果一些顶点“入”和一些“出”,c)如果所有顶点都“出”,则丢弃整个三角形。因此,如果我正确理解了您最初的担忧,这正是您想要的。@dm.skt我不记得硬件剪裁平面在D3D9中按像素级别工作,正如您所描述的。如果你有一个链接,我很高兴被证明是错的/