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"
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章