Unity在Shader里面反射天空盒

根据视线求得视线的反射方向; 我们根据反射方向来采样到一个天空盒CubeMap;

  • 首先在属性里面需要一个外届传来的CubeMap;
  • 然后需要用到Unity内置的函数,所以要include UnityCG.cginc;
  • 主要操作为在顶点着色器里面根据视线方向和法向量来求得视线的反射方向;
  • 在片元里面将cubemap采到我们的视线反射TEXCOORD里面;

其中用到了很多内置函数,比如给我们的reflect来求反射的
反射方向原理其实就是:
反射方向
reflect

Shader "Unlit/TexCube"
{
    Properties
    {
        _CubeMap ("CubeMap", Cube) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }


        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            samplerCUBE _CubeMap;
            struct appdata
            {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
            };
            
            struct v2f
            {
                float4 position : SV_POSITION;         
                float3 worldNormal : TEXCOORD0;
                float3 reflectPos : TEXCOORD1;
            };


            v2f vert (appdata v)
            {
                v2f o;
                o.position = UnityObjectToClipPos(v.vertex);
                float3 worldPos = mul(unity_ObjectToWorld,v.vertex);
                o.worldNormal = UnityObjectToWorldNormal(v.normal);
                float3 ViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
                o.reflectPos =  reflect(-ViewDir , o.worldNormal);
                return o;
            }

            float4 frag (v2f i) : SV_Target
            {
                return texCUBE(_CubeMap,i.reflectPos);

            }
            ENDCG
        }
    }
    Fallback "Diffuse"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章