노멀 벡터 시각화
이 예제의 Unity 셰이더는 메시의 노멀 벡터 값을 시각화합니다.
URP 언릿 기본 셰이더 섹션의 Unity 셰이더 소스 파일을 사용하고 ShaderLab 코드에 다음 변경 사항을 적용하십시오.
이 예제의 버텍스 셰이더에 대한 입력 구조인
struct Attributes
에서 각 버텍스의 노멀 벡터가 포함되어 있는 변수를 선언합니다.struct Attributes { float4 positionOS : POSITION; // Declaring the variable containing the normal vector for each vertex. half3 normal : NORMAL; };
이 예제의 프래그먼트 셰이더에 대한 입력 구조인
struct Varyings
에서 각 프래그먼트의 노멀 벡터 값을 저장하기 위한 변수를 선언합니다.struct Varyings { float4 positionHCS : SV_POSITION; // The variable for storing the normal vector values. half3 normal : TEXCOORD0; };
이 예제는 각 프래그먼트의 RGB 컬러 값으로 노멀 벡터의 세 가지 컴포넌트를 사용합니다.
메시의 노멀 벡터 값을 렌더링하기 위해 다음 코드를 프래그먼트 셰이더로 사용합니다.
half4 frag(Varyings IN) : SV_Target { half4 color = 0; color.rgb = IN.normal; return color; }
Unity가 메시의 노멀 벡터 값을 렌더링합니다.
캡슐의 일부가 검게 보이는데, 이는 해당 포인트에서 노멀 벡터 컴포넌트의 세 가지 컴포넌트가 모두 음수이기 때문입니다. 다음 단계에서 이 영역의 값을 렌더링하는 방법도 보여드리겠습니다.
음수 노멀 벡터 컴포넌트를 렌더링하려면 압축 기술을 사용합니다. 노멀 컴포넌트 값
(-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
}
}
}