URP simple code

URP로 셰이더 코드를 작성할려면 가져올수 있는 기본 코드를 확인해보자.
https://docs.unity3d.com/kr/Packages/com.unity.render-pipelines.universal@15.0/manual/writing-shaders-urp-basic-unlit-structure.html

// 이 셰이더는 코드에 사전 정의된 컬러로 메시 모양을 채웁니다.
Shader "Example/URPUnlitShaderBasic"
{
    // Unity 셰이더의 프로퍼티 블록입니다. 이 예제에서 이 블록은 비어 있습니다.
    // 출력 컬러가 프래그먼트 셰이더 코드에 사전 정의되어 있기 때문입니다.
    Properties
    { }

    // 셰이더 코드가 포함된 서브셰이더 블록입니다.
    SubShader
    {
        // 서브셰이더 태그는 서브셰이더 블록 또는 패스가 실행되는 시기와
        // 조건을 정의합니다.
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            // HLSL 코드 블록입니다. Unity 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;
            };

            struct Varyings
            {
                // 이 구조체의 포지션에는 SV_POSITION 시맨틱이 있어야 합니다.
                float4 positionHCS  : SV_POSITION;
            };

            // Varyings 구조에 정의된 프로퍼티가 있는 버텍스 셰이더
            // 정의입니다. vert 함수의 타입은 반환하는 타입(구조체)과
            // 일치해야 합니다.
            Varyings vert(Attributes IN)
            {
                // 출력 오브젝트(OUT)를 Varyings 구조체로 선언합니다.
                Varyings OUT;
                // TransformObjectToHClip 함수는 버텍스 포지션을 오브젝트 공간에서
                // 균일한 클립 공간으로 변환합니다.
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                // 출력을 반환합니다.
                return OUT;
            }

            // 프래그먼트 셰이더 정의입니다.
            half4 frag() : SV_Target
            {
                // 컬러 변수를 정의하고 반환합니다.
                half4 customColor = half4(0.5, 0, 0, 1);
                return customColor;
            }
            ENDHLSL
        }
    }
}

결과)
메시에 빨간색을 표시 합니다.

Input, Output을 사용하지 않고 “Attributes”와 “Varyings” 변수를 사용할까요?

그래픽스 교재들에서 사용해온 관행에서 비롯 된것입니다.
OpenGL을비롯하여 심지어 DirectX 문서에도 있습니다.

Vertex Attribute
OpenGL 명세에서는 정점 입력을 Vertex Attributes라고 부릅니다.

Varying
OpenGL 문서, 교재에서 다음 표현을 씁니다.
“this varying is interpolated…”

DirectX 문서에서는 VS → PS로 전달되는 데이터를 다음과 같이 표현 합니다.
"interpolated values varying data"

결론
Attributes  // “정점 고유 데이터”
Varyings   // “보간되어 다음 단계로 가는 데이터”