立方体 反射 CubeMap
阅读原文时间:2023年07月09日阅读:1

  在虚拟环境中,我们需要模拟材质球反射周围的环境,立方体反射正是让材质球反射出天空盒的背景的方法之一。

  当我们观察物体时,物体表面足够光滑,再视线方向和物体相交的点上,能够看到物体映射的周围环境,交点上呈现的正是沿着反射方向观察到的物体。

  1. 我们需要在同一空间(这里是世界空间)中计算 视线方向I、反射向量R;

    视线方向: float3 I = posW -_WorldSpaceCameraPos.xyz;//摄像机指向顶点的方向

    反射向量: o.R = reflect(I,N);//反射向量,cg内置函数

 源代码:

Shader "JQM/CubeReflectCube"
{
Properties
{
_Reflectivity ("Reflectivity", Range (,)) = 0.5
_MainTex("Base", 2D) = "white"
_Environment ("Environment", Cube) = "white"
}

 SubShader  
 {

     Pass  
     {  
         CGPROGRAM

         #pragma vertex vert  
         #pragma fragment frag

         #include "UnityCG.cginc"

         sampler2D \_MainTex;  
         float4 \_MainTex\_ST;

         samplerCUBE \_Environment;  
         float \_Reflectivity;

         struct v2f  
         {  
             float4 pos : SV\_POSITION;  
             float2 uv : TEXCOORD0;  
             float3  R:TEXCOORD1;  
         };

         v2f vert (appdata\_base v)  
         {  
             v2f o;  
             o.pos = mul(UNITY\_MATRIX\_MVP, v.vertex);  
             o.uv = TRANSFORM\_TEX(v.texcoord, \_MainTex);

             float3 posW = mul(\_Object2World,v.vertex).xyz;  
             float3 I = posW -\_WorldSpaceCameraPos.xyz;//顶点到摄像机方向  
             float3 N = mul((float3x3)\_Object2World,v.normal);  
             N = normalize(N);  
             o.R = reflect(I,N);//反射向量

             return o;  
         }

         fixed4 frag (v2f i) : SV\_Target  
         {  
             float4 reflectiveColor = texCUBE(\_Environment,i.R);  
             float4 decalColor = tex2D(\_MainTex,i.uv);  
             float4 outp = lerp(decalColor,reflectiveColor,\_Reflectivity);  
             return outp;

         }  
         ENDCG  
     }  
 }  

}