用unity制作能量护盾(1)

在油管上看到unityJapan办的官方演讲会中,讲解了如何用shaderGraph制作一个能量护盾。我就跟着模仿地做了一下,效果如图。
官方油管地址:https://www.youtube.com/watch?v=7ToExWKVZW0&t=2407s
用unity制作能量护盾(1)_第1张图片
主要有3个工作:
1)检测物体之间的接触边缘
2)画出透明物体的边缘
3)扭曲透过物体的像。

STEP 1)
打开渲染管线设定中的DepthTextture,获取场景深度
用unity制作能量护盾(1)_第2张图片建立一个Unlit shader,master节点设定改为transparent渲染队列,双面渲染。
用unity制作能量护盾(1)_第3张图片
建立一个sceenDepth节点,采样改为eye
再建立一个screenPosition节点,模式改为raw来获取不透明物体的深度信息。
把screenPosition节点里的w分量分出来,用sceenDepth节点输出的值去减,最后输出到master节点上的color看一下。发现同球体接触的边缘变黑。
节点图:
用unity制作能量护盾(1)_第4张图片
效果:
用unity制作能量护盾(1)_第5张图片原理如下图:

用unity制作能量护盾(1)_第6张图片球体表面的深度同不透明物体深度一致的话,相减得零,自然输出黑色。视线网上移动,差值增加,直到大于等于1,以上就都是白色了。
接着,用一个值去减之前输出的值,让接近接触边缘的值大,远离边缘的值小,再输出到master节点的alpha里,就能形成边缘有颜色的,远离边缘的地方透明的效果。
节点图为:用unity制作能量护盾(1)_第7张图片
利用一个Vector1的变量(即edgeOffset)通过控制被减数的大小来控制边缘描绘的宽度。因为相减后有小于0的情况同时为了让边缘过度更平滑,用smoothstep来控制输出的值。
用unity制作能量护盾(1)_第8张图片结果:
用unity制作能量护盾(1)_第9张图片
这里要注意的是因为是用ztest的深度值来做差分,这个只能检测出透明和不透明的边界。
其他的应用的话,如制作岸边发白的部分。
用unity制作能量护盾(1)_第10张图片之后绘出非接触的边缘轮廓线。
首先考虑直接用菲涅尔效应节点。但因为要用双面绘制,导致无法使用这个节点。
用unity制作能量护盾(1)_第11张图片考虑菲涅尔效应的原理。
用unity制作能量护盾(1)_第12张图片将物体表面的法线向量点乘视线方向的单位向量的值,如上图所示。越靠近摄像机中间的点内积越接近1或-1,而物体边缘的内积为0。如果将内积看作alpha值的话。我们是希望边缘为1,中间为0。但由于背面的值为负。所以先取绝对值,再用1减这个值。
用unity制作能量护盾(1)_第13张图片节点图
用unity制作能量护盾(1)_第14张图片用1减后的值,用一个vector1的变量和power节点来控制菲尼尔效应的强度。将这个输出值用add节点同之前的边缘发光的值相加。效果如下:
用unity制作能量护盾(1)_第15张图片STEP 1)END

你可能感兴趣的:(unityshader)