{}!Google Tag Manager end}} 노멀 벡터 시각화 | Universal RP | 14.0.9
docs.unity3d.com
    목차 표시/숨기기

    노멀 벡터 시각화

    이 예제의 Unity 셰이더는 메시의 노멀 벡터 값을 시각화합니다.

    URP 언릿 기본 셰이더 섹션의 Unity 셰이더 소스 파일을 사용하고 ShaderLab 코드에 다음 변경 사항을 적용하십시오.

    1. 이 예제의 버텍스 셰이더에 대한 입력 구조인 struct Attributes에서 각 버텍스의 노멀 벡터가 포함되어 있는 변수를 선언합니다.

      struct Attributes
      {
          float4 positionOS   : POSITION;
          // Declaring the variable containing the normal vector for each vertex.
          half3 normal        : NORMAL;
      };
      
    2. 이 예제의 프래그먼트 셰이더에 대한 입력 구조인 struct Varyings에서 각 프래그먼트의 노멀 벡터 값을 저장하기 위한 변수를 선언합니다.

      struct Varyings
      {
          float4 positionHCS  : SV_POSITION;
          // The variable for storing the normal vector values.
          half3 normal        : TEXCOORD0;
      };
      

      이 예제는 각 프래그먼트의 RGB 컬러 값으로 노멀 벡터의 세 가지 컴포넌트를 사용합니다.

    3. 메시의 노멀 벡터 값을 렌더링하기 위해 다음 코드를 프래그먼트 셰이더로 사용합니다.

      half4 frag(Varyings IN) : SV_Target
      {
          half4 color = 0;
          color.rgb = IN.normal;
          return color;
      }
      
    4. Unity가 메시의 노멀 벡터 값을 렌더링합니다.

      압축 없이 노멀을 렌더링

      캡슐의 일부가 검게 보이는데, 이는 해당 포인트에서 노멀 벡터 컴포넌트의 세 가지 컴포넌트가 모두 음수이기 때문입니다. 다음 단계에서 이 영역의 값을 렌더링하는 방법도 보여드리겠습니다.

    5. 음수 노멀 벡터 컴포넌트를 렌더링하려면 압축 기술을 사용합니다. 노멀 컴포넌트 값 (-1..1) 범위를 컬러 값 범위 (0..1)로 압축하려면 다음 줄을 변경합니다.

      color.rgb = IN.normal;
      

      위 줄을 아래 줄로 변경하십시오.

      color.rgb = IN.normal * 0.5 + 0.5;
      

    이제 Unity가 메시에서 노멀 벡터 값을 컬러로 렌더링합니다.

    압축을 사용하여 노멀을 렌더링

    아래는 이 예제의 완전한 ShaderLab 코드입니다.

    // 이 셰이더는 메시의 노멀 벡터 값을 시각화합니다.
    Shader "Example/URPUnlitShaderNormal"
    {
        Properties
        { }
    
        SubShader
        {
            Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }
    
            Pass
            {
                HLSLPROGRAM
                #pragma vertex vert
                #pragma fragment frag
    
                #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"
    
                struct Attributes
                {
                    float4 positionOS   : POSITION;
                    // 각 버텍스에 대한 노멀 벡터를 포함하는 변수를
                    // 선언합니다.
                    half3 normal        : NORMAL;
                };
    
                struct Varyings
                {
                    float4 positionHCS  : SV_POSITION;
                    half3 normal        : TEXCOORD0;
                };
    
                Varyings vert(Attributes IN)
                {
                    Varyings OUT;
                    OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                    // TransformObjectToWorldNormal 함수를 사용하여 오브젝트에서
                    // 월드 공간으로 노멀을 변환합니다. 이 함수는 Core.hlsl에서
                    // 참조되는 SpaceTransforms.hlsl 파일에서 가져왔습니다.
                    OUT.normal = TransformObjectToWorldNormal(IN.normal);
                    return OUT;
                }
    
                half4 frag(Varyings IN) : SV_Target
                {
                    half4 color = 0;
                    // IN.normal은 3D 벡터입니다. 각 벡터 컴포넌트의 범위는
                    // -1..1입니다. 음수 값을 포함하여 모든 벡터 요소를
                    // 컬러로 표시하기 위해 각 값을 0..1 범위로 압축합니다.
                    color.rgb = IN.normal * 0.5 + 0.5;
                    return color;
                }
                ENDHLSL
            }
        }
    }
    
    맨 위로
    Copyright © 2023 Unity Technologies —
    • Your Privacy Choices (Cookie Settings)