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:几何着色器的主要内容,如果未能解决你的问题,请参考以下文章

shader几何运算效果

Unity Shader着色器优化

Unity Shader的形式

[OpenGL] 几何着色器

Unity3D Shader系列之渲染流水线

[Unity] Shader(着色器)之纹理贴图