引入今天的话题前,先来看一组来自《Unity Shader入门精要》中的渲染流水线图。今天所要下手的就是在顶点和片段着色器之间有一个可选的着色器(几何着色器)。

Geometry Shader(Unity几何着色器)

    几何着色器有意思的地方在于它在提交到下一个流水线前可以把(一个或多个)顶点转变为完全不同的基本图形。从而制作一些酷炫的效果。仅仅通过最简单基础的编程可以很轻松的实现如下效果。

效果1(显示网格顶点):

Geometry Shader(Unity几何着色器)

 

效果2(显示网格线条):

Geometry Shader(Unity几何着色器)

 

效果3(对三角面的重新构建):

Geometry Shader(Unity几何着色器)

Geometry Shader(Unity几何着色器)

 

 

遗憾的是笔者也是初学的菜鸟,更多的效果还期待大家的不断研习。Geometry Shader(Unity几何着色器)

 

实例探讨

首先应该声明在shader中开启Geometry Shader编程语句。

#pragma geometry geom

 

然后书写对应的定制Geometry Shader函数:

Geometry Shader(Unity几何着色器)

 

    上图展示的实际就是输出顶点的Geometry Shader代码。Geometry Shader(Unity几何着色器)小伙伴们惊呆了竟是如此的简单。

[maxvertexcount(x)]  x是几何着色器为单个调用输出的顶点的最大数量。对于我的理解就是你要单次执行最终输出结果的总的顶点数量。官方指出出于性能考虑,最大顶点数应尽可能小。

geom的输入第一个参数常用的就是point(点)和triangle(三角形单元)。第二个参数PointStream 是通过将顶点附加到输出流对象来一次输出一个顶点。可选择的固定种类有PointStream(点) 、LineStream(线) 、TriangleStream(三角形)。下图则为示例输出(网格线)LineStream的简单应用。

Geometry Shader(Unity几何着色器)

    到这里应该是有一个简单的初识了吧。趁热打铁接下来我们再来搞点稍微炫酷的事情。接下来我们分析下下图这种效果的实现吧。

Geometry Shader(Unity几何着色器)

笔者不太擅长表达,还是先把核心代码放出来吧。Geometry Shader(Unity几何着色器)

Geometry Shader(Unity几何着色器)

调用的自己构建三角形函数如下。

Geometry Shader(Unity几何着色器)

 

    我们选择对三角面的处理,这里我们geom函数第一个参数针对的是triangle图元,第二个参数针对的同样是重新构建三角形。所以我们选择TriangleStream输出流。

 

步骤1:

通过三角形图元的向量叉乘结果,找到正确的法线向量(注意叉积的顺序)。

Geometry Shader(Unity几何着色器)

 

步骤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();


作为笔者的公众号的第一篇文章,到这里基本也就结束了。小伙伴们多关注下我的微信公众号,我将长期分享一些自己工作和业余中的菜鸟研究。Geometry Shader(Unity几何着色器)Geometry Shader(Unity几何着色器)

贴上我自己的源码工程地址:

https://pan.baidu.com/s/1MiXbBdnrl-Sm58g1P5K7eg

密码:33j8

 

基于笔者时间有限,根据兴趣小伙伴可以拓展实现更多的如下酷炫效果:

【爆炸】

Geometry Shader(Unity几何着色器)

【消散】

Geometry Shader(Unity几何着色器)

 

【海平面(纪念碑谷)】

Geometry Shader(Unity几何着色器)

相关文章: