unity之自制玻璃啤酒瓶shader

Posted carsonche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity之自制玻璃啤酒瓶shader相关的知识,希望对你有一定的参考价值。

客户的要求如下

技术分享

步骤:

1.进行玻璃瓶效果分析

效果如下:高光,类次表面散射(里层通透而外层较为暗淡),外层白色勾勒轮廓。

 

高光:unity内部提供光滑度参数,越光滑则高光效果越明显,啤酒瓶材质是属于光滑,高光明显,可用下面的公式:

o.Smoothness = _Glossiness;

 数值可控制在0.9附近。

 

外层白色轮廓描边:

描边效果很常见,只要获取物体的外边缘再加上自发光系数就可以做个很好的描边效果了

half rim = 1.0 - saturate(dot (normalize(IN.viewDir),IN.worldNormal));
//边缘颜色强度 越大反而越不可见,线条越细
//变浅,每个UV上的RGB*对应的norml与视觉的夹角
o.Emission = _RimColor.rgb * pow (rim, _RimPower);

与视角的范围平行,dot两向量则为1,rim值越小越接近0,垂直,dot两向量为0,rim值越大越接近1。

然后用pow阶乘,放大效果。这个学过极限的话及很容易明白,x-0,则阶乘指数越大则数越小,越趋向于0,反之则越接近于1

 

次表面散射:光射入非金属材质后再内部发生散射,最后射出物体并进入视野中产生的现象,是指光从表面进入物体经过内部散射,然后又通过物体表面的其他顶点出射的光线传递过程。

而在这里我使用了视觉假象来完成就是在中间的为亮面,边缘的为暗面,直接用两种颜色进行过渡了,核心公式为:

fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
half rim = 1.0 - saturate(dot (normalize(IN.viewDir),IN.worldNormal));

o.Albedo = lerp(_SubColor.rgb, c.rgb, rim);

 

 

 

先算出边缘的数值rim,然后利用rim来进行次表面颜色和主颜色的过度,这样就可以很好的制造出次表面的现象,当然这是一种取巧的做法,貌似还有更好的做法等着我去研究。

技术分享

 

 路还很远,这次感觉还有很多做的不好的地方,如果有不对的地方欢迎指出,我还是图形学的新手。

以上是关于unity之自制玻璃啤酒瓶shader的主要内容,如果未能解决你的问题,请参考以下文章

unity模仿瓶子中的液体晃动

Unity ShaderShader纹理映射的例子

机器视觉之表面缺陷检测

Unity Shader ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现

Unity3D自学记录Unity3D之自制小钟表

空泡效应造成啤酒瓶碎裂