您的位置:首页 > 移动开发 > Unity3D

用unity制作能量护盾(1)

2020-07-18 04:31 603 查看

在油管上看到unityJapan办的官方演讲会中,讲解了如何用shaderGraph制作一个能量护盾。我就跟着模仿地做了一下,效果如图。
官方油管地址:https://www.youtube.com/watch?v=7ToExWKVZW0&t=2407s

主要有3个工作:
1)检测物体之间的接触边缘
2)画出透明物体的边缘
3)扭曲透过物体的像。

STEP 1)
打开渲染管线设定中的DepthTextture,获取场景深度
建立一个Unlit shader,master节点设定改为transparent渲染队列,双面渲染。

建立一个sceenDepth节点,采样改为eye
再建立一个screenPosition节点,模式改为raw来获取不透明物体的深度信息。
把screenPosition节点里的w分量分出来,用sceenDepth节点输出的值去减,最后输出到master节点上的color看一下。发现同球体接触的边缘变黑。
节点图:

效果:
原理如下图:

球体表面的深度同不透明物体深度一致的话,相减得零,自然输出黑色。视线网上移动,差值增加,直到大于等于1,以上就都是白色了。
接着,用一个值去减之前输出的值,让接近接触边缘的值大,远离边缘的值小,再输出到master节点的alpha里,就能形成边缘有颜色的,远离边缘的地方透明的效果。
节点图为:
利用一个Vector1的变量(即edgeOffset)通过控制被减数的大小来控制边缘描绘的宽度。因为相减后有小于0的情况同时为了让边缘过度更平滑,用smoothstep来控制输出的值。
结果:

这里要注意的是因为是用ztest的深度值来做差分,这个只能检测出透明和不透明的边界。
其他的应用的话,如制作岸边发白的部分。
之后绘出非接触的边缘轮廓线。
首先考虑直接用菲涅尔效应节点。但因为要用双面绘制,导致无法使用这个节点。
考虑菲涅尔效应的原理。
将物体表面的法线向量点乘视线方向的单位向量的值,如上图所示。越靠近摄像机中间的点内积越接近1或-1,而物体边缘的内积为0。如果将内积看作alpha值的话。我们是希望边缘为1,中间为0。但由于背面的值为负。所以先取绝对值,再用1减这个值。
节点图
用1减后的值,用一个vector1的变量和power节点来控制菲尼尔效应的强度。将这个输出值用add节点同之前的边缘发光的值相加。效果如下:
STEP 1)END

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: