Unity Shader:几何着色器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shader:几何着色器相关的知识,希望对你有一定的参考价值。
参考技术A 在我翻译过的OpenGL和实时渲染相关文章中,简要介绍过几何着色器,它的执行顺序位于细分曲面着色器、光栅化与片元着色器之间,有时不会使用细分曲面着色器,且常不表示固定阶段,所以简要来说,顶点着色器的输出到几何着色器,接着进行某些增减基本体的操作,然后进入片元着色器进行光照计算操作。几何着色器本质上最常用的是增加基本体,可以用于生成粒子,毛发等。
Unity中,和顶点与片元着色器一样,使用一个预编译指令来标明函数,且额外定义一个结构体用于变量的输入输出,供着色器之间通信。这里给出一个简单的几何着色器例子:
注意三个结构体:
对于将顶点转换到裁剪空间,以及变换UV的操作,我们在几何着色器中执行了,实际上也可以在顶点着色器中执行,只是这么做的话,更灵活。
对于几何着色器函数,这里复制一下:
maxvertexcount 代表几何着色器会增加的顶点的最大数量。由于我们在物体上实际添加一个三角形,所以这里设置为3.
接下来讲解几何着色器函数的参数:
接着讲解函数体。首先我们定义一个 g2f 的结构体对象,我们会对其进行操作然后加入列表中。
然后,我们进行一个简单的循环,将每个输入的顶点添加到流中,创建三角形。因为数据要传入片元着色器,因此我们将顶点坐标转换到裁剪空间,并且按系数偏移UV。
最后,我们使用 triStream.Append(o) 将一个修改过的 g2f 结构体添加到三角形流中。在结束循环后,使用 RestartStrip 函数,这可以让流明白一个独立的三角形要在之后添加。这里并没有额外生成顶点等,一切保持原状。
现在我们扩展这个简单的几何着色器,我们从每个三角形上挤出一个金字塔的形状,即在三角形中心添加一个顶点,然后沿法线方向挤出面。
在最开始,我们添加了 _ExtrusionFactor 属性,用于控制挤出的高度。接着开启 Cull Off ,关闭面消隐。
在几何着色器函数中,我们首先设置最大输出顶点数量,相当于生成4个三角形,即在每个三角形的基础上生成3个三角形来组成锥体。
对于挤出操作,我们需要每个三角形的中心作为法线,因此,我们通过对三角形各个顶点的坐标做平均计算来得到重心,然后同样通过平均计算来得到三角形的法线。
然后我们生成锥体,算法过程为:
这就是第一个循环所做的事情。第二个循环中,我们将最开始的三角形组装起来,然后就可以得到想要的三角锥了。
以上是关于Unity Shader:几何着色器的主要内容,如果未能解决你的问题,请参考以下文章