반응형
유니티 쉐이더는 게임 개발에서 다양한 시각 효과를 구현하는 데 필수적인 요소입니다. 이 글에서는 초보자부터 중급자까지 이해하기 쉽게 쉐이더의 기본 개념과 활용 방법을 설명하고자 합니다. 특히 RGB 슬라이더 제작, 텍스쳐 입히기, UV 좌표 활용, Lerp 함수 활용에 초점을 맞추어 심층적으로 다루겠습니다.
RGB 슬라이더 제작
(1) 프로퍼티스 설정
- 먼저 프로퍼티스(Properties)에서 인터페이스를 만들고 Range 속성을 사용하여 슬라이더를 생성합니다.
(2) SubShader에서 변수 선언
- SubShader에서 'float _Red', 'float _Green', 'float _Blue'와 같이 변수를 선언합니다.
- 변수 선언은 텍스쳐 입히기와 같은 다른 기능을 사용하기 위한 필수적인 과정입니다.
(3) Input 구조체 선언 및 활용
- 만약 Input 구조체를 선언하지 않고 void surf에서 매개변수 Input In을 생략하면 UV 좌표와 같은 중요한 데이터를 쉐이더 코드 내에서 사용할 수 없게 됩니다.
- Input 구조체는 쉐이더 코드 내에서 입력 데이터를 받아오는 역할을 합니다.
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
// …
}
(4) void surf에서 코드 작성
- void surf에서 슬라이더 값을 적용합니다.
- 코드 작성 시 변수명과 연산 순서를 주의해야 합니다.
Shader "MyShader"
{
Properties
{
R ("R", Range(0,1)) = 0.5
G ("G", Range(0,1)) = 0.5
B ("B", Range(0,1)) = 0.5
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
float R,G,B;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
o.Emission = float3(R,G,B);
}
ENDCG
}
}
텍스쳐 입히기
(1) 프로퍼티스 설정
- 텍스쳐를 입히기 위해 프로퍼티스에서 'Texture2D _MainTex'와 같이 인터페이스를 만들고 초기값을 설정합니다.
- 옵션 부분은 현재 활용 사례가 많지 않지만 필요에 따라 설정할 수 있습니다.
(2) SubShader에서 변수 선언
- SubShader에서 'sampler2D _MainTex'와 같이 텍스쳐 변수를 선언합니다.
- 텍스쳐 변수는 'sampler2D' 타입을 사용하며, 변수명은 '_MainTex'와 같이 명확하게 지정합니다.
(3) UV 좌표 활용
- UV 좌표는 텍스쳐의 픽셀을 2D 공간에 매핑하는 데 사용됩니다.
- struct Input에서 'float2 uv_MainTex'와 같이 UV 변수를 선언합니다.
- void surf에서 'tex2D(_MainTex, In.uv_MainTex)'와 같이 tex2D 함수를 사용하여 텍스쳐를 UV 좌표에 매핑합니다.
Shader "MyShader"
{
Properties
{
_MainTex("텍스쳐", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
float4 MainTex = tex2D(_MainTex, IN.uv_MainTex);
o.Emission = MainTex;
}
ENDCG
}
}
(4) Lerp 함수 활용
- Lerp 함수는 두 값 사이를 매끄럽게 보간하는 데 사용됩니다.
- 텍스쳐 블렌딩, 컬러 변환 등 다양한 상황에 활용할 수 있습니다.
- void surf에서 'lerp(ColorA, ColorB, _Alpha)'와 같이 Lerp 함수를 사용하여 두 컬러를 알파 값에 따라 보간합니다.
Shader "MyShader"
{
Properties
{
_MainTex("텍스쳐", 2D) = "white" {}
_MainTex2("텍스쳐2", 2D) = "white" {}
_Blend("블렌딩", Range(0,1)) = 0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Standard fullforwardshadows
#pragma target 3.0
sampler2D _MainTex, _MainTex2;
float _BV;
struct Input
{
float2 uv_MainTex;
float2 uv_MainTex2;
};
void surf (Input IN, inout SurfaceOutputStandard o)
{
float4 MainTex = tex2D(_MainTex, IN.uv_MainTex);
float4 MainTex2 = tex2D(_MainTex2, IN.uv_MainTex2);
o.Emission = lerp(MainTex, MainTex2, _BV);
}
ENDCG
}
}
'Unity' 카테고리의 다른 글
Unity Shader : UV 매핑 (5) | 2024.03.17 |
---|---|
Unity Light : 조명 (0) | 2024.03.15 |
Unity Shader : 코드 분석 (0) | 2024.03.14 |
Unity Shader : 기초 (0) | 2024.03.13 |
RigidbodyConstraints : 회전과 위치 제어 (0) | 2024.03.09 |