Shader "Custom/Triplanar"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Top("Top", 2D) = "white" {}
        _Side("Side", 2D) = "white" {}
        _Front("Front", 2D) = "white" {}

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Lambert
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _Top;
        sampler2D _Front;
        sampler2D _Side;

        struct Input
        {
            float2 uv_MainTex;
            float3 worldPos;
            float3 worldNormal;
            INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            //fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

            float2 topUV = float2(IN.worldPos.x, IN.worldPos.z);
            float2 sideUV = float2(IN.worldPos.z, IN.worldPos.y);
            float2 frontUV = float2(IN.worldPos.x, IN.worldPos.y);




            float4 topColor = tex2D(_Top, topUV); // green = 1

            float4 sideColor = tex2D(_Side, sideUV); // red = 1

            float4 frontColor = tex2D(_Front, frontUV); // blue = 1

            //float3 n = WorldNormalVector(IN, o.Normal); //해당 면의 normal 벡터 => 값이 1이 된다.
            
            //혼합 lerp
            
            //float3 e = lerp(0, 1, topColor.g);
            //o.Emission = topColor.rgb;
            //o.Albedo = sideColor.rgb;
            //o.Emission = n.rgb;
            o.Albedo = lerp(topColor, frontColor,abs(IN.worldNormal.z));
            //위쪽 면의 색상과 앞면의 색상을 표면의 기울기에 따라 가중 평균화하여 새로운 색상을 생성
            //기울기가 높을수록 앞면의 색상이 더 많이 나타나며, 기울기가 낮을수록 위쪽 면의 색상이 더 많이 나타낸다.
            o.Albedo = lerp(o.Albedo, sideColor, abs(IN.worldNormal.x));
            o.Alpha = 1;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

그림과 같이 각 면이 해당하는 벡터를 확인한 후 색상을 집어 넣어야 한다.

 

Shader "Custom/Triplanar"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Top("Top", 2D) = "white" {}
        _Side("Side", 2D) = "white" {}
        _Front("Front", 2D) = "white" {}

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Lambert
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _Top;
        sampler2D _Front;
        sampler2D _Side;

        struct Input
        {
            float2 uv_MainTex;
            float3 worldPos;
            float3 worldNormal;
            INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            //fixed4 c = tex2D (_MainTex, IN.uv_MainTex);

            float2 topUV = float2(IN.worldPos.x, IN.worldPos.z);
            float2 sideUV = float2(IN.worldPos.z, IN.worldPos.y);
            float2 frontUV = float2(IN.worldPos.x, IN.worldPos.y);




            float4 topColor = tex2D(_Top, topUV); // green = 1

            float4 sideColor = tex2D(_Side, sideUV); // red = 1

            float4 frontColor = tex2D(_Front, frontUV); // blue = 1

            float3 n = WorldNormalVector(IN, o.Normal); //해당 면의 normal 벡터 => 값이 1이 된다.
            
            //혼합 lerp
            
            //float3 e = lerp(0, 1, topColor.g);
            //e = lerp (e, topColor.r, sideColor);
            //e = lerp (e, topColor.b, frontColor);
            //o.Emission = topColor.rgb;
            //o.Albedo = sideColor.rgb;
            o.Emission = n.rgb;
            //o.Albedo = lerp(topColor, frontColor,abs(IN.worldNormal.z));
            //위쪽 면의 색상과 앞면의 색상을 표면의 기울기에 따라 가중 평균화하여 새로운 색상을 생성
            //기울기가 높을수록 앞면의 색상이 더 많이 나타나며, 기울기가 낮을수록 위쪽 면의 색상이 더 많이 나타낸다.
            //o.Albedo = lerp(o.Albedo, sideColor, abs(IN.worldNormal.x));
            o.Alpha = 1;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

https://docs.unity3d.com/ScriptReference/Vector3.Lerp.html

 

Unity - Scripting API: Vector3.Lerp

Interpolates between the points a and b by the interpolant t. The parameter t is clamped to the range [0, 1]. This is most commonly used to find a point some fraction of the way along a line between two endpoints (e.g. to move an object gradually between t

docs.unity3d.com

 

'산대특 > 게임 UIUX 프로그래밍' 카테고리의 다른 글

Shader - Cubemap Reflection  (0) 2024.02.22
Shader - Diffuse Warping  (0) 2024.02.22
Shader -Blinn Phong 스펙큘러  (0) 2024.02.22
Shader - Lambert  (0) 2024.02.20
Shader - Vertex  (0) 2024.02.19

+ Recent posts