700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Unity Shader通过菲涅尔反射和散射实现玻璃效果

Unity Shader通过菲涅尔反射和散射实现玻璃效果

时间:2023-08-07 08:43:30

相关推荐

Unity Shader通过菲涅尔反射和散射实现玻璃效果

unity3d学习交流群913755380

Shader "Unlit/Dispersion"{Properties {fresnelPower("fresnelPower",float)=0fresnelScale("fresnelScale",float)=0fresnelBias("fresnelBias",float)=0_r("r",float)=0_g("g",float)=0_b("b",float)=0_diffuse("Diffuse",color)=(1,1,1,1)}SubShader{Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"struct v2f {float3 normal:NORMAL;float4 pos : SV_POSITION;float4 objectPOS:float;};//在外部可改为power=4,scale=0.1,bias=-0.2float fresnelPower=4;float fresnelScale=0.1f;float fresnelBias=-0.2f;//红,绿,蓝的折射率,从外部赋值,方便调整float3 etaRatio;// =float3(0.83f,0.67f,0.55f); //1/1.3 1/1.5 1/1.8float _r;float _g;float _b;half4 _diffuse;v2f vert (float4 vertex : POSITION, float3 normal : NORMAL){v2f o;o.pos = UnityObjectToClipPos(vertex);o.normal=normal;o.objectPOS=vertex;return o;}//为了达到最佳效果,将所有计算都写在了片段着色器内。fixed4 frag (v2f i) : SV_Target{etaRatio=float3(_r,_g,_b);i.normal = mul(i.normal,unity_WorldToObject);float3 worldPos = mul(unity_ObjectToWorld, i.objectPOS).xyz;float3 worldViewDir = UnityWorldSpaceViewDir(worldPos);//反射向量的反向量float3 R=reflect(-worldViewDir,i.normal);R=normalize(R);i.normal=normalize(i.normal);//计算用来模拟色散的折射向量float3 Tred=refract(-R,i.normal,etaRatio.x);float3 Tgreen=refract(-R,i.normal,etaRatio.y);float3 Tblue=refract(-R,i.normal,etaRatio.z);//菲涅尔factor,用来混合反射与折射颜色。float reflectionfactor=min(1.0f,max(0,fresnelBias+fresnelScale*pow(1.0f+dot(-R,i.normal),fresnelPower)));//如果利用color存此变量,可以省去min与max。//color reflectionfactor=fresnelBias+fresnelScale*pow(1.0f+dot(normalize(-worldViewDir),i.normal),fresnelPower);//float3 worldLightDir = normalize(_WorldSpaceLightPos0);//half4 Diffuse=_diffuse * saturate(dot(i.normal, worldLightDir));//反射颜色float4 reflectedColor=UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, R);reflectedColor.a=1;//reflectedColor= reflectedColor*Diffuse;float4 refractedColor;//折射颜色refractedColor.r=UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, Tred).r;refractedColor.g=UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, Tgreen).g;refractedColor.b=UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, Tblue).b;refractedColor.a=1.0f;//refractedColor=(refractedColor+Diffuse);//混合fixed4 c=lerp(refractedColor,reflectedColor,reflectionfactor.x);return c;//return c*_diffuse;}ENDCG}}}

需要用到反射探针“Reflection Probe”

弹珠的开源仓库:/Claybe/Canica

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。