【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现 (3)

在使用该函数时,我们也没有对  i.worldReflect 进行归一化,是因为这里的参数仅仅是作为一个方向变量(笔者测试过归一化的情况,结果一样)。

将所有计算结果混合得到最终颜色返回,再加上一个  FallBack "Reflective/VertexLit"  完成。

 

VII. 保存,回到 Unity 查看效果,以下是不同 _ReflectAmount 的反射效果

【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现

  很抱歉的是 git 图录制的清晰度不够好,以下两图是 _ReflectAmount 为 1 时的效果

【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现

【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现

 

完整代码:

1 Shader "Unity/01-Reflection" { 2 Properties { 3 _Color ("Color Tint", Color) = (1,1,1,1) 4 _ReflectColor("Reflection Color",Color) = (1,1,1,1) 5 _ReflectAmount("Reflect Amount",Range(0,1)) = 1 6 _Cubemap("Reflection Cubemap",Cube) = "_Skybox"{} 7 } 8 SubShader 9 { 10 11 Pass 12 { 13 Tags { "LightMode"="ForwardBase" } 14 15 CGPROGRAM 16 #pragma multi_compile_fwdbase 17 #pragma vertex vert 18 #pragma fragment frag 19 #include "Lighting.cginc" 20 #include "AutoLight.cginc" 21 22 fixed4 _Color; 23 fixed4 _ReflectColor; 24 float _ReflectAmount; 25 samplerCUBE _Cubemap; 26 27 struct a2v 28 { 29 float4 vertex : POSITION; 30 float3 normal : NORMAL; 31 }; 32 33 struct v2f 34 { 35 float4 pos : SV_POSITION; 36 float3 worldnormal : TEXCOORD0; 37 float3 worldpos : TEXCOORD1; 38 float3 worldViewDir : TEXCOORD2; 39 float3 worldReflect : TEXCOORD3; 40 SHADOW_COORDS(4) 41 }; 42 43 v2f vert(a2v v) 44 { 45 v2f o; 46 o.pos = UnityWorldToClipPos(v.vertex); 47 o.worldnormal = UnityObjectToWorldNormal(v.normal); 48 o.worldpos = mul(unity_ObjectToWorld,v.vertex).xyz; 49 o.worldViewDir = UnityWorldSpaceViewDir(o.worldpos); 50 o.worldReflect = reflect(-o.worldViewDir,o.worldnormal); 51 TRANSFER_SHADOW(o); 52 return o; 53 } 54 55 fixed4 frag(v2f i) : SV_Target 56 { 57 fixed3 worldnormal = normalize(i.worldnormal); 58 fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldpos)); 59 fixed3 worldViewDir = normalize(i.worldViewDir); 60 61 fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz; 62 63 fixed3 diffuse = _LightColor0.rgb * _Color.rgb * max(0,dot(worldnormal,worldLightDir)); 64 65 fixed3 reflection = texCUBE(_Cubemap,i.worldReflect).rgb * _ReflectColor.rgb; 66 UNITY_LIGHT_ATTENUATION(atten,i,i.worldpos); 67 fixed3 color = ambient + lerp(diffuse ,reflection,_ReflectAmount) * atten; 68 return fixed4(color,1.0); 69 70 } 71 ENDCG 72 } 73 74 75 } 76 FallBack "Reflective/VertexLit" 77 }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygsdp.html