在虛擬環境中,咱們須要模擬材質球反射周圍的環境,立方體反射正是讓材質球反射出天空盒的背景的方法之一。app
當咱們觀察物體時,物體表面足夠光滑,再視線方向和物體相交的點上,可以看到物體映射的周圍環境,交點上呈現的正是沿着反射方向觀察到的物體。ide
1. 咱們須要在同一空間(這裏是世界空間)中計算 視線方向I、反射向量R;函數
視線方向: float3 I = posW -_WorldSpaceCameraPos.xyz;//攝像機指向頂點的方向 spa
反射向量: o.R = reflect(I,N);//反射向量,cg內置函數 code
源代碼:orm
1 Shader "JQM/CubeReflectCube" 2 { 3 Properties 4 { 5 _Reflectivity ("Reflectivity", Range (0,1)) = 0.5 6 _MainTex("Base", 2D) = "white" 7 _Environment ("Environment", Cube) = "white" 8 } 9 10 SubShader 11 { 12 13 Pass 14 { 15 CGPROGRAM 16 17 #pragma vertex vert 18 #pragma fragment frag 19 20 #include "UnityCG.cginc" 21 22 sampler2D _MainTex; 23 float4 _MainTex_ST; 24 25 samplerCUBE _Environment; 26 float _Reflectivity; 27 28 struct v2f 29 { 30 float4 pos : SV_POSITION; 31 float2 uv : TEXCOORD0; 32 float3 R:TEXCOORD1; 33 }; 34 35 v2f vert (appdata_base v) 36 { 37 v2f o; 38 o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 39 o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); 40 41 float3 posW = mul(_Object2World,v.vertex).xyz; 42 float3 I = posW -_WorldSpaceCameraPos.xyz;//頂點到攝像機方向 43 float3 N = mul((float3x3)_Object2World,v.normal); 44 N = normalize(N); 45 o.R = reflect(I,N);//反射向量 46 47 48 return o; 49 } 50 51 fixed4 frag (v2f i) : SV_Target 52 { 53 float4 reflectiveColor = texCUBE(_Environment,i.R); 54 float4 decalColor = tex2D(_MainTex,i.uv); 55 float4 outp = lerp(decalColor,reflectiveColor,_Reflectivity); 56 return outp; 57 58 } 59 ENDCG 60 } 61 } 62 }