// 이 셰이더는 코드에 미리 정의된 색으로 메쉬 형태를 채웁니다.
Shader "Example/URPUnlitShaderBasic"
{
    // 유니티 셰이더의 프로퍼티 블록입니다. 이 예제에서 이 블록은 비어 있습니다
    // 왜냐하면 출력 색상이 프래그먼트 셰이더 코드에 미리 정의되어 있기 때문입니다.
    Properties
    { 
        _BaseColor("Base Color", Color) = (1, 1, 1, 1)
        _BaseMap("Base Map", 2D) = "white"
    }

    // 셰이더 코드를 포함하고 있는 SubShader 블록입니다.
    SubShader
    {
        // SubShader 태그는 언제, 그리고 어떤 조건 하에서 SubShader 블록이나
        // 패스가 실행될지 정의합니다.
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalRenderPipeline" }

        Pass
        {
            // HLSL 코드 블록입니다. 유니티 SRP는 HLSL 언어를 사용합니다.
            HLSLPROGRAM

            // 이 줄은 버텍스 셰이더의 이름을 정의합니다.
            #pragma vertex vert
            // 이 줄은 프래그먼트 셰이더의 이름을 정의합니다.
            #pragma fragment frag

            // Core.hlsl 파일에는 자주 사용되는 HLSL 매크로와 함수의 정의가 포함되어 있으며,
            // 또한 다른 HLSL 파일(예: Common.hlsl, SpaceTransforms.hlsl 등)에 대한 #include 참조를 포함하고 있습니다.
            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            // 구조체 정의는 그것이 어떤 변수들을 포함하고 있는지 정의합니다.
            // 이 예제는 Attributes 구조체를 버텍스 셰이더의 입력 구조체로 사용합니다.
            struct Attributes
            {
                // positionOS 변수는 오브젝트 공간에서의 버텍스 위치를 포함하고 있습니다.
                float4 positionOS   : POSITION;  
                // uv 변수는 주어진 버텍스에 대한 텍스쳐에서의 UV 좌표를 포함하고 있습니다.
                float2 uv           : TEXCOORD0;
            };

            struct Varyings
            {
                // 이 구조체 안의 위치는 SV_POSITION semantic을 가져야 합니다.
                float4 positionHCS  : SV_POSITION;
                // uv 변수는 주어진 버텍스에 대한 텍스쳐에서의 UV 좌표를 포함하고 있습니다.
                float2 uv           : TEXCOORD0;
            };            

            // 이 매크로는 _BaseMap을 Texture2D 객체로 선언합니다.
            TEXTURE2D(_BaseMap);
            // 이 매크로는 _BaseMap 텍스쳐에 대한 샘플러를 선언합니다.
            SAMPLER(sampler_BaseMap);

                // Unity 셰이더를 SRP Batcher와 호환되게 만들기 위해서,
                // Material과 관련된 모든 프로퍼티를 UnityPerMaterial이라는 이름의
                // 단일 CBUFFER 블록 내에 선언하십시오.
            CBUFFER_START(UnityPerMaterial)
                // 다음 줄은 _BaseColor 변수를 선언하여, 이를
                // 프래그먼트 셰이더에서 사용할 수 있게 합니다.
                float4 _BaseMap_ST;       
            CBUFFER_END

            // Varyings 구조체에서 정의된 프로퍼티를 가진 버텍스 셰이더의 정의입니다.
            // vert 함수의 유형은 반환하는 유형(구조체)과 일치해야 합니다.
            Varyings vert(Attributes IN)
            {
                // Varyings 구조체를 사용하여 출력 객체(OUT)를 선언합니다.
                Varyings OUT;
                // TransformObjectToHClip 함수는 버텍스 위치를 오브젝트 공간에서 동차 공간으로 변환합니다.
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                // TRANSFORM_TEX 매크로는 타일링과 오프셋 변환을 수행합니다.
                OUT.uv = TRANSFORM_TEX(IN.uv, _BaseMap);
                // 출력을 반환합니다.
                return OUT;
            }

            // 프래그먼트 셰이더의 정의입니다.
            half4 frag(Varyings IN) : SV_Target
            {
                // SAMPLE_TEXTURE2D 매크로는 주어진 샘플러로 텍스쳐를 샘플링합니다.
                half4 color = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
                return color;
            }
            ENDHLSL
        }
    }
}

 

 

Shader "HSH/UpgradeColorEffect"
{
    Properties
    { 
        _MainTex("MainTex", 2D) = "white" {}
    }

    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalRenderPipeline" }
        LOD 100

        Blend SrcAlpha OneMinusSrcAlpha
        ZWrite Off
        Cull Off

        Pass
        {
            HLSLPROGRAM

            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS   : POSITION;  
                float2 uv           : TEXCOORD0;
                float4 color        : COLOR;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
                float2 uv           : TEXCOORD0;
                float4 screenPos    : TEXCOORD1;
                float4 color        : COLOR;
            };            

            TEXTURE2D(_MainTex);
            SAMPLER(sampler_MainTex);

            CBUFFER_START(UnityPerMaterial)
                float4 _MainTex_ST;   
            CBUFFER_END

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                OUT.uv = TRANSFORM_TEX(IN.uv, _MainTex);
                OUT.screenPos = ComputeScreenPos(OUT.positionHCS);
                OUT.color = IN.color;
                return OUT;
            }
            
            half4 frag(Varyings IN) : SV_Target
            {
                half4 textureColor = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uv);
                return textureColor * IN.color;
            }

            ENDHLSL
        }
    }
}

+ Recent posts