Unity Shader: Shader粒子广告牌

发表于2018-11-02
评论0 4.4k浏览
广告牌效果既是不论物体与摄像机的角度,被渲染物体总是正对着摄像机。

此技术广泛利用于粒子效果中,例如Unity内置的Particle System。下文将要介绍如何在Shader中实现广告牌效果。
(图1:效果图)

此项技术的核心是在视空间(view space)将顶点进行重新定位。

简单例子:

网上有一个简单的例子:
(https://en.wikibooks.org/wiki/Cg_Programming/Unity/Billboards):
...略
            output.pos = mul(UNITY_MATRIX_P, 
              mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0))
              + float4(input.vertex.x, input.vertex.y, 0.0, 0.0)
              * float4(_ScaleX, _ScaleY, 1.0, 1.0));
...略
主要看以上这行代码。

核心思想:

通过以上代码理解广告牌的两处核心逻辑:
先看mul(UNITY_MATRIX_MV, float4(0.0, 0.0, 0.0, 1.0)):
float4(0.0, 0.0, 0.0, 1.0)代表顶点所属物体在Model空间中的位置,mul MV矩阵后,变换到世界空间对应位置再转换到视空间。在此阶段x,y轴方向既是屏幕的xy轴。
进入到了视空间,并把当前顶点移到了被渲染物体所在位置,接下来要进行适当的偏移,使各个顶点重新连接成正对摄像机的图元。

+ float4(input.vertex.x, input.vertex.y, 0.0, 0.0):
由于vertex.xy是相对模型中心点的距离,因此在比较简单的图元中,例如矩形,可以把他理解成矩形的长宽的一半(假如矩形的中心点是在正中)。那么在此将四个顶点的位置分别在视空间中向x方向偏移vertex.x,向y方向偏移vertex.y,就相当于以float4(0.0, 0.0, 0.0, 1.0)为中心,面向摄像机重新定位了矩形的四个顶点。

以上的代码试用于当图元的顶点是以坐标轴中的xy分布的,例如quad,如果是其他情况,例如plane的顶点是以xz分布,那么代码就要改为+ float4(input.vertex.x, input.vertex.z, 0.0, 0.0):
绿:y
兰:z
红:x
(图2:plane的顶点以xz分布)

(图3:quad的顶点以xy分布)

推广到复杂分布的粒子网格:

以上代码只适用于渲染单个quad,或plane。在用同一个Shader渲染复杂网格的情况下,需要用每个quad的中心点取代上文中的‘float(0,0,0,1)’。
(图4:在线型网格中实现粒子广告牌)

(图5:效果图中的三维零散分布网格)

计算两个三角形组合的quad中心点可以在cpu中(脚本)进行,然后通过Mesh插入顶点属性中,Shader在渲染时通过相应的语义获取。也可以在Shader的几何着色器中进行计算,不论哪种,计算公式为:
如果v0与v3为quad对角,v_center为quad中心点,那么

具体实现代码就不再赘述。
来自:https://blog.csdn.net/liu_if_else/article/details/77163322

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引