在ShadowgunSample中学到了用shader实现一个广告牌(Billboard)效果,这里记录下。在ShadowgunSample的场景中,这个模型两边的光晕永远是对着移动中的摄像机,如下图:
其实你如果看这个模型,它就是一个面片。然后在顶点着色器里面根据摄像机的当前的视角来修正每个顶点位置从而达到整个面片一直正向对着相机的效果。单独提取这个光晕模型显示的效果:
下面来介绍下这个效果是怎样实现过程。
首先我们分析这个模型,模型的顶点色存储了每个对应的每个顶点规范之后的坐标,即把模型坐标规范到[0, 1]范围,这个可以直接查看模型的vertices和colors值对比下就可以知道(这里只取顶点0,1, 3,2):
1 |
|
所以这里求出来的centerOffs是当前的顶点坐标距离模型的中心点的偏移值。
1 |
|
这一步的计算过程:
- 把存储在v.color中模型的规范坐标转换到[-0.5, 0.5]范围模型坐标
- 把上一步得到的[-0.5, 0.5]的模型坐标与存储在uv2中的模型的宽高相乘的得到当前顶点距离模型中心点的偏移值
接着用顶点的模型坐标加上该顶点距离模型中心点的偏移,得到centerLocal是模型中心点的坐标
1 |
|
得到模型中心点的坐标之后计算摄像机对模型的视角的方向向量:
1 |
|
然后到最重要的计算模型随着摄像机的视角的变化而变化的偏移:
1 |
|
完整的shader如下:
1 |
|
如果看到这里理解还是有些模糊,那么接下来我们用C#来模拟下shader运算的过程,用C#的好处是每个数据都可以实时显示出来或者输出Log,更加直观。
我们用C#在运行时刻创建一个Mesh面片,自己自定义6个顶点。顶点的分布如下:
1 |
|
创建Mesh的代码:
1 |
|
用到的支持顶点色的Shader(这里用的是Surface Shader):
1 |
|
创建的Mesh显示如下:
然后照着ShadowgunSample的Shader计算每个顶点随着相机的移动来变换,从而实现这个Mesh面片的Billboard效果:
1 |
|
运行Editor然后移动相机,可以看到这个面片的Billboard效果了。
现在如果对Shader里面哪里不明白的地方,可以利用这个C#模拟的例子运行起来断点看每一步计算的值。这样就很容易理解其中的每个步骤了。
END