커스텀 제어 가능 알파 블렌딩 && 펙터
2022. 7. 26. 18:30ㆍPublic/Shader
다음은 모든 문제가 그대로 발생하는, 전형적인 알파 블렌딩 쉐이더 이다.
Shader "Custom/CustomBlending_problematic_Shader"
{
Properties
{
_MainTex ("Albedo (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Transparent" "Queue" = "Transparent"}
zwrite off
blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma surface surf Lambert keepalpha
#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 "Legacy Shaders/Transparent/VertexLit"
}
- 주의할점 -
- zwrite off가 명시적으로 선언됐다.
- blend SrcAlpha OneMinusSrcAlpha라는 구문이 생겼다.
- keepalpha 라는 구문이 생겼다.
blend SrcAlpha OneMinusSrcAlpha
블렌딩 옵션이다. 이곳에서 사용할 수 있는 블렌딩 펙터는 다음이 있다.
- One //숫자 1을 의미
- Zero //숫자 0을 의미
- SrcColor // 소스의 컬러를 의미
- SrcAlpha //소스의 알파를 의미
- DstColor //목적지(배경)의 컬러를 의미
- DstAlpha //목적지(배경)의 알파를 의미
- OneMinusSrcColor // 1 - 소스 컬러를 의미
- OneMinusSrcAlpha // 1- 소스 알파를 의미
- OneMinusDstColor // 1 - 목적지(배경)의 컬러를 의미
- OneMinusDstAlpha // 1- 목적지(배경)의 알파를 의미
keepalpha //기본적으로 모든 불투명 쉐이더에 알파에 1.0을 입력하게 되어있다. 그것을 막아준다.
위의 코드에서 주목할 것은
zwrite on / off 로 z버퍼에 쓸 것인지의 여부를 선택할 수 있고 , blend 펙터로 블렌딩을 제어할 수 있다는 것이다.
메뉴얼을 보면 다음과 같은 기본적인 블렌딩 펙터 연산 조합을 추천하고 있다.
- Blend SrcAlpha OneMinusSrcAlpha // Alpha blending
- Blend SrcAlpha One // Additive
- Blend One One // Addtive No Alpha Black is Transparent
- Blend DstColor Zero // Multiplicative
- Blend DstColor SrcColor // 2x Multiplicative
이 조합 공식의 기본 공식은 다음과 같다.
(펙터) X Source + (펙터) X Destination
이펙터 그 '본인'은 'Source'(Src) 라 칭하고 이펙트가 그려질 때의 '배경'은 'Destination'(Dest)라고 칭한다.
'Public > Shader' 카테고리의 다른 글
블렌드 펙터 연산 - SrcAlpha One (0) | 2022.07.27 |
---|---|
블렌드 펙터 연산 - SrcAlpha OneMinusSrcAlpha (0) | 2022.07.27 |
알파 테스팅과 컷아웃 (0) | 2022.07.26 |
Alpha Blend (0) | 2022.07.25 |
Cubemap Reflection (0) | 2022.07.25 |