Alpha Blend
2022. 7. 25. 16:52ㆍPublic/Shader
* 불투명(Opaque) 오브젝트는 먼저 그린다.
-> 불투명 오브젝트들은 Z버퍼 때문에 어차피 순서에 상관없이 그려도 상관이 없으므로 먼저 그린다.
* 반투명(Transparent) 오브젝트는 나중에 그린다.
-> 정확히는 반투명 계열의 쉐이더를 나중에 그립니다.
* 반투명 오브젝트들끼리는 '멀리 있는 것' 부터 가까운 것까지 차례대로 그린다.
이것을 '알파 소팅(Alpha Sorting)' 이라고 합니다.
위의 문제점을 해결하기 위해서 매 프레임마다 계산되어야 하는 연산을 생각하면
- 불투명 오브젝트들은 그저 계산되는 대로 그려주면 아무 문제가 없다. 반투명 오브젝트들은 일단 불투명한 오브젝트가 다 그려질 때까지 대기해야한다.
- 그리고 이번엔 반투명 오브젝트들끼리 거리를 체크하는 연산을 추가해야 한다.
- 불투명한 오브젝트는 앞에 커다란 벽이 있으면 그 뒤의 오브젝트는 그려주지 않아도 되므로 절약할 거리가 있는데, 반투명한 오브젝트는 뒤에서부터 그리게 되므로 앞에 커다란 반투명이 있으면 오히려 계산이 더 무거워지는 결과를 초래하게 된다.
- 디퍼드 렌더링(Deferred Rendering)에서는 아예 반투명을 처리할 수 없어서, 포워드 렌더링 (Forward Rendering)으로 반투명을 따로 그려줘야만 한다.
요약하자면 알파의 원리는 다음과 같다.
- 불투명(Opaque) 오브젝트는 먼저 그린다.
- 반투명(Transparent) 오브젝트는 나중에 그린다.
- 반투명 오브젝트들끼리는 뒤에서부터 그린다.
일단 기본적인 Alpha Shader 를 만들어 보겠습니다.
Shader "Custom/0725AlphaBlend"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue" = "Transparent"}
//Queue -> '그리는 순서'를 의미 Transparent라고 하면 '불투명 다음'에 그리는 것을 의미
//양면 렌더
cull off
CGPROGRAM
#pragma surface surf Lambert alpha:fade
#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
}
//그림자가 Quad 모양으로 생성되는것을 사라지게 함
FallBack "Legacy Shaders/Transparent/VertexLit"
}
}
여기에 _Color 기능만 추가하면 유니티 기본 내장 쉐이더인 Legacy Shaders/Transparent/Diffuse 와 동일
'Public > Shader' 카테고리의 다른 글
커스텀 제어 가능 알파 블렌딩 && 펙터 (0) | 2022.07.26 |
---|---|
알파 테스팅과 컷아웃 (0) | 2022.07.26 |
Cubemap Reflection (0) | 2022.07.25 |
커스텀 라이팅2 (0) | 2022.07.17 |
커스텀 라이팅 (0) | 2022.07.17 |