引入今天的话题前,先来看一组来自《Unity Shader入门精要》中的渲染流水线图。今天所要下手的就是在顶点和片段着色器之间有一个可选的着色器(几何着色器)。
几何着色器有意思的地方在于它在提交到下一个流水线前可以把(一个或多个)顶点转变为完全不同的基本图形。从而制作一些酷炫的效果。仅仅通过最简单基础的编程可以很轻松的实现如下效果。
效果1(显示网格顶点):
效果2(显示网格线条):
效果3(对三角面的重新构建):
遗憾的是笔者也是初学的菜鸟,更多的效果还期待大家的不断研习。
实例探讨
首先应该声明在shader中开启Geometry Shader编程语句。
#pragma geometry geom
然后书写对应的定制Geometry Shader函数:
上图展示的实际就是输出顶点的Geometry Shader代码。小伙伴们惊呆了竟是如此的简单。
[maxvertexcount(x)] x是几何着色器为单个调用输出的顶点的最大数量。对于我的理解就是你要单次执行最终输出结果的总的顶点数量。官方指出出于性能考虑,最大顶点数应尽可能小。
geom的输入第一个参数常用的就是point(点)和triangle(三角形单元)。第二个参数PointStream 是通过将顶点附加到输出流对象来一次输出一个顶点。可选择的固定种类有PointStream(点) 、LineStream(线) 、TriangleStream(三角形)。下图则为示例输出(网格线)LineStream的简单应用。
到这里应该是有一个简单的初识了吧。趁热打铁接下来我们再来搞点稍微炫酷的事情。接下来我们分析下下图这种效果的实现吧。
笔者不太擅长表达,还是先把核心代码放出来吧。
调用的自己构建三角形函数如下。
我们选择对三角面的处理,这里我们geom函数第一个参数针对的是triangle图元,第二个参数针对的同样是重新构建三角形。所以我们选择TriangleStream输出流。
步骤1:
通过三角形图元的向量叉乘结果,找到正确的法线向量(注意叉积的顺序)。
步骤2:
将 v0、v1、v2的图元点沿着法线方向做长度延申。
float3 v3 = IN[0].vertex + normalFace * _Length;
float3 v4 = IN[1].vertex + normalFace * _Length;
float3 v5 = IN[2].vertex + normalFace * _Length;
步骤3:
然后以(v0,v3,v2)、(v3,v5,v2)、(v3,v4,v0)、(v4,v1,v0)、(v5,v2,v1)、(v5,v4,v1)、(v3,v4,v5)这6组三角形顶点构建新的三棱柱表面。
步骤4:
这里特别注意不能忽略的是,每当构建一个三角形都需要调用一次tristream.RestartStrip();
作为笔者的公众号的第一篇文章,到这里基本也就结束了。小伙伴们多关注下我的微信公众号,我将长期分享一些自己工作和业余中的菜鸟研究。
贴上我自己的源码工程地址:
https://pan.baidu.com/s/1MiXbBdnrl-Sm58g1P5K7eg
密码:33j8
基于笔者时间有限,根据兴趣小伙伴可以拓展实现更多的如下酷炫效果:
【爆炸】
【消散】
【海平面(纪念碑谷)】