해당 포스팅은 " 따라 하면서 배우는 유니티 5 셰이더와 이펙트 입문 " 기반으로 정리 하였습니다.
Lighting 설정 : Window - Rendering - Lighting
유니티는 인라이튼(Enlighten)이라는 조명 솔루션을 가지고 있다. 인라이튼 조명에는 두가지 기법이 존재한다.
[ 기법 종류 ]
1. 베이크된 전역 조명(Baked Global Illumination)
2. 실시간 전역 조명(Precomputed Realtime Global Illumination)
베이크 조명 ( Bake Light )
: 모든 광원과 발광 표면을 지원하지만 조명을 끄고 키는 등의 동적 요소는 제대로 지원 하지 못한다.
: 최적의 효율을 가지고 있음
실시간 조명
: 프레임마다 계산되며 동적 상황에 적합하지만 이에 대한 지원은 제한적이다.
발광 효과 나타내기
1. 표준 쉐이더의 발광(Emission)을 통해 효과를 나타낼 수 있다.
- 완전한 흰색의 경우 최고 발광을 의미하며, 검은색은 최저 발광을 의미한다.
발광 효과를 나타내기 위해 Light을 통해 효과를 나타낼 수 있다.
2. 해당 씬에서는 포인트 라이트(Point Light)의 Range와 Intensity(빛의 세기) 조절을 통해 효과를 나타내었다.
3. Main Camera에 글로우 효과를 블룸(Bloom)이라고 불린다.
발광표현을 비롯한 모든 광원에서 자체 조명 값이 따라 빛이 나타난다.
해당 효과는 Assets - Import Package - Effects - Bloom을 통해 효과 스크립트를 추가하여 사용할 수 있다.
Bloom의 값을 변경하면서 발광 효과를 더욱 나타낼 수 있다.
4. 반사 프로브( Reflection Probe ) 추가하기
반사 프로브( Reflection Probe )
: 빛의 반사를 시뮬레이션 / 반사되는 머터리얼 값을 샘플링 한다.
반사 프로브를 추가하면서 Bloom의 효과를 더 극대화하게 보여 줄 수 있다.
와이어프레임 발광
: 오브젝트 표면에서 빛을 내는 것이 아닌 geometry 경계에서 빛이나는 쉐이더 제작
: 내면과 외면을 구분하여 별도로 렌더링을 한다.
SubShader
{
Tags { "RenderType" = "Transparent" "Queue" = "Transparent"}
}
"Queue" = "Transparent"
: 다른 파라미터 및 렌더링 순서를 결정하기 위해 사용
: 오브젝트를 드로우 처리할 순서를 결정
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
Cull Front
AlphaTest Greater 0.5
}
블렌드 모드
: 패스가 쉐이더의 나머지 부분과 결합되는 방법을 지정
: 원본 텍스처와 대상 텍스처의 두 요소를 포함한다.
SrcAlpha : 알파를 블렌딩할 때는 알파를 원본 또는 대상으로 작성하는 방법으로 지정한다.
외면의 경우 두 번째 Pass에 지정을 한다.
그 이유는 멀리 있는 대상을 먼저 렌더링 하고 Z축 경합(Z-Fighting)문제를 예방하기 위함
- 마지막 행은 픽셀을 완전히 투명하거나 불투명하게 정의해줌
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma vertex vert
: 버텍트 함수는 vert로 사용
#pragma vertex frag
: 프래그먼트 함구는 frag로 사용
struct appdata
{
float4 vertex : POSITION;
float4 texcoord1 : TEXCOORD0;
float color : COLOR;
};
struct appdata : Mesh에 필요한 데이터 선언 구조체 / 버텍트와 관련
POSITION : X, Y, Z, W 의 버텍스의 포지션
float2, float3, float4
TEXCOORDO : 첫번째 UV 좌표
float2, float3, flaot4
COLOR : 버텍스당 컬러
float4
struct v2f
{
float4 pos : POSITION;
float4 texcoord1 : TEXCOORD0;
float4 color : COLOR;
};
struct v2f : FromVertToFrag 구조체
버텍스에서 지오메트리를 그리기 위한 계산을 조각화
v2f vert(appdata v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.texcoord1 = v.texcoord1;
o.color = v.color;
return o;
}
v2f vert : Vertex를 배치하기 위해 Mesh Info 필요
v2f o : 조각화하는 버텍스를 정의
UV 좌표를 이용해 정의한 버텍스 색상으로 출력
fixed4 frag(v2f i) : COLOR
{
fixed4 answer;
float lx = step(_Width, i.texcoord1.x);
float ly = step(_Width, i.texcoord1.y);
float hx = step(i.texcoord1.x, 1.0 - _Width);
float hy = step(i.texcoord1.y, 1.0 - _Width);
answer = lerp(_EdgeColor, _Color, lx * ly * hx * hy);
return answer;
}
프로퍼티와 제오메트리에서 얻는 버텍스 데이터를 바탕으로 최종 형태 정의
'Shader' 카테고리의 다른 글
[ Shader ] 06. 스페큘러와 메탈릭 표면 (0) | 2023.05.25 |
---|---|
[ Shader ] 05.투명 표면 (0) | 2023.05.17 |
[ Shader ] 04.쉐이더를 이용한 애니메이션 (0) | 2023.05.13 |
[ Shader ] 02.커스텀 쉐이더( Custom Shader ) 란? (1) | 2023.05.10 |
[ Shader ] 01.표준 쉐이더(Standard Shader) 란? (0) | 2023.05.09 |