[유니티 쉐이더 스타트업] Part 17 | 커스텀 제어 알파 블렌딩

jungizz_·2023년 3월 10일
0

Unity Shader StartUp

목록 보기
17/17
post-thumbnail

1. 커스텀 제어 가능한 알파 블렌딩

  • 이펙트용 쉐이더를 만들기 위해서는 커스텀으로 제어해야 할 수 있는 것이 늘어난다.
  • 이전 파트에서 배운 전형적인 알파 블렌딩 쉐이더에 기능을 추가하여 시작한다. (아직 모둔 문제가 그대로 발생한다.)

✔️ 추가된 기능

  • zwrite off - z버퍼에 위치값을 입력하지 않음을 명시적으로 선언
  • blend SrcAlpha OneMinusSrcAlpha - 블렌딩 옵션, 사용할 수 있는 블렌딩 펙터가 여러가지 있다. (아래 추가 설명)
  • keepalpha - 유니티 5.0부터 서피스 쉐이더에 기본적으로 모든 불투명 쉐이더 알파에 1.0을 입력하는데 이를 막아준다.
❗ z버퍼에 위치값 입력의 여부를 선택할 수 있고, blend펙터로 블렌딩을 제어할 수 있게됐다.

2. 블렌드(Blend) 펙터 연산

(펙터) × Source + (펙터) × Destination

  • Source (Src) - 이펙트 자신 (우리가 만드는 쉐이더가 적용되는 곳)
  • Destination (Dest) - 이펙트가 그려질 때의 배경
  • 블렌딩 펙터
blend 펙터 (블렌딩 옵션)
One숫자 1
Zero숫자 0
SrcColor소스의 컬러
SrcAlpha소스의 알파
DatColor목적지(배경)의 컬러
DatAlpha목적지(배경)의 알파
OneMinusSrcColor1-소스 컬러
OneMinusSrcAlpha1-소스 알파
OneMinusDatColor1-목적지(배경) 컬러
OneMinusDatAlpha1-목적지(배경) 알파
  • 메뉴얼에서 추천하는 기본적인 블렌딩 펙터 연산 조합
블렌딩 펙터 조합
Blend SrcAlpha OneMinusSrcAlphaAlpha Blending
Blend ScrAlpha OneAddictive
Blend One OneAdditive No Alpha Black is Transparent
Blend DstColor ZeroMultiplicative
Blend DstColor SrcColor2x Multiplicative

1. SrcAlpha OneMinusSrcAlpha

  • (SrcAlpha) × Source + (OneMinusSrcAlpha) × Destination
//코드
blend SrcAlpha OneMinusSrcAlpha

// (정확히 확인하기 위해 Albedo는 Emission으로 바꿔준다.)
  • 알파가 뚫리는 Alpha Blend모드
  • 그저 알파에 의해 두 장이 섞이는 듯한 보통의 결과물

2. SrcAlpha One

  • (SrcAlpha) × Source + (One) × Destination
//코드
blend SrcAlpha One
  • Src와 Dest가 합쳐지며 밝아지는 Add모드
  • 겹칠수록 밝아지며 폭발 효과에서 많이 사용된다.

3. One One

  • (One) × Source + (One) × Destination
//코드
blend One One
  • 위의 Add모드처럼 겹칠수록 밝아지지만 알파 채널이 전혀 작동하지 않는 Additive No Alpha Black is Transparent로 검은색만이 투명함을 결정한다.
  • One One을 사용할 때는 Source에서 뚫리길 원하는 부분을 검은색으로 그린다.
  • 이펙트에서 알파 채널을 절약하면서 Add모드를 가동할 때 사용한다.

4. DstColor Zero

  • (DstColor) × Source + (Zero) × Destination
//코드
blend DstColor Zero
  • 두번째 연산은 Zero를 곱해 검게 된 배경이기 때문에 더하기에서 아무런 영향이 없어 첫번째 연산만 남는 Multi모드
  • 흰색만이 투명함을 결정한다.

5. DstColor SrcColor

  • (DstColor) × Source + (SrcColor) × Destination
//코드
blend DstColor SrcColor
  • 두 연산 모두 어두워지며 더하기로 살짝 밝아지며 색이 약간 올라오는 2x Multi
  • 투명한 이미지를 만드는게 불가능한 연산이지만 아래 연산을 넣으면 가능하다.

❗ 블렌딩과 Z버퍼와의 관계

  • 반투명에서 완벽히 앞뒤 판정을 하는 것은 무리이며 위의 다섯가지 예제에서도 문제가 계속 발생했다.
  • SrcAlpha OneMinusAlpha모드에서는 문제가 도드라지지만 나머지 모드에서는 크게 티나지 않았으므로 보통 아무 생각 없이 사용한다 (...)
  • 주의해야할 점은 Add와 Multiply 모드를 동시에 사용하는 경우이며, 성질이 극명하게 다른 두 쉐이더가 동시에 나타날 때에는 티나기 쉽다.
  • 실제 사용되는 경우에서는 빌보드 방식 / 피봇점을 강제로 이동 / 강제로 그리는 순서 지정 등 다양한 방식을 사용한다.

3. 유니티에 내장된 파티클 쉐이더와 비슷하게 만들기

☑️ 파티클 쉐이더의 특성

  1. 빛을 받지 않기 때문에 빛의 연산이 필요가 없다.
  2. 그림자도 없기 때문에 라이트맵도 관계가 없다.
  3. 파티클 컬러가 조절되어야 한다.
  4. 알파 블렌딩 옵션이 조절되어야 한다.
  • Surface Shader는 빛 관련 함수 없이는 존재하지 않으며 조명 연산을 완전히 건너뛸 수 없기 때문에 1, 2번 특성을 만족하려면 최대한 피해가야 한다.
  • 그래서 대부분의 내장 파티클 쉐이더는 좀 더 순수한 Fragment Shader로 작성되어있다.
  • 가장 효율적이지는 않지만 지금까지 배운 지식을 통해 Surface Shader로 어느 정도까지는 가볍게 만들어 볼 수 있다.

☑️ 파티클 쉐이더

  • _TintColor - 전체를 제어하는 색상, 회색일 때 자신 색이 나오고 흰색이면 밝게, 검은색이면 어둡게 나오도록 하기 위해 기본 값이 회색이다.
  • "IgnoreProgjection" = "True" - 유니티 내장 프로텍터에 반응하지 않도록 해줌
  • noforwardadd nolightmap noambient novertexlights noshadow - 자동생성되는 추가 쉐이더들을 생성되지 않도록 해줌
  • Cull off - 2side mode
  • float4 color:Color - 파티클 컬러 옵션이 적용되도록 하기 위해 불러온 Vertex Color
  • float4 Lightnolight - 연산이 없는 라이팅 구문을 만듦
  • Particle System을 추가하고 위의 쉐이더를 적용시켜 텍스쳐를 넣는다.
profile
( •̀ .̫ •́ )✧

0개의 댓글

관련 채용 정보