立方體 反射 CubeMap

立方體反射(CubeMap)

  在虛擬環境中,咱們須要模擬材質球反射周圍的環境,立方體反射正是讓材質球反射出天空盒的背景的方法之一。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 }
View Code
相關文章
相關標籤/搜索