Unity Shader Blend SrcAlpha OneMinusSrcAlpha
https://rito15.github.io/posts/unity-transparent-stencil/
알파 블렌딩, 알파 소팅
겹쳐 있는 반투명 오브젝트의 픽셀들은 최종적으로 계산된 색상값으로 화면에 그려지는데, 이를 알파 블렌딩(Alpha Blending)이라고 한다.
반투명 쉐이더는 기본적으로 알파 블렌딩 쉐이더라고 부른다.
그리고 반투명 오브젝트는 불투명 오브젝트와 다르게 멀리 있는 것부터 그려지는데, 이를 알파 소팅(Alpha Sorting)이라고 한다.
이 때 거리값을 판별하는 기준은 “카메라에서 오브젝트 피벗까지의 거리”를 이용한다.
알파 소팅을 하는 이유?
바로 이런 문제를 해결하기 위함이다.
불투명을 그릴 때는 “앞에 오브젝트가 존재하면 뒤의 오브젝트는 그리지 않는 것”이 당연한데,
반투명 오브젝트를 그릴 때도 그렇게 해버리면 안되므로
“불투명보다 반투명을 무조건 나중에 그리기”로 합의해서 불투명-반투명 오브젝트간의 문제는 해결했다.
그런데 이번에는 똑같은 문제가 반투명 오브젝트 사이에서도 발생한다.
따라서 이를 해결하기 위해 반투명 오브젝트를 그릴 때 카메라로부터 피벗까지의 거리를 기준으로 멀리 있는 오브젝트부터 그리도록 하여,
앞의 오브젝트를 먼저 그려서 뒤의 오브젝트가 가려지는 일이 발생하지 않게 하는 것이다.
알파 블렌딩 쉐이더 작성하기
Source Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Shader "Custom/AlphaBlend"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue"="Transparent" }
CGPROGRAM
#pragma surface surf Lambert alpha:fade // alpha:fade 또는 alpha:blend
#pragma target 3.0
sampler2D _MainTex;
struct Input
{
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
}
ENDCG
}
Fallback "Transparent" // 그림자 없애기
}
기본적으로 알파 블렌딩 쉐이더를 만들려면,
- Tags의 RenderType과 Queue를
"Transparent"
로 작성한다. pragma에
alpha:fade
,alpha:blend
중 하나를 작성한다.
(keepalpha
옵션도 있지만, 커스텀 알파 블렌딩 항목에서 설명한다.)- 반투명 오브젝트는 그림자가 없는 것이 당연하므로, Fallback은
"Transparent"
로 작성한다.
(Fallback에 지정한 쉐이더가 그림자의 생성에 영향을 준다.)
댓글
댓글 쓰기