본문 바로가기
Computer Graphics/ShaderLab, HLSL

[ShaderLab] 알파 블렌딩 (Alpha Blending)

by 진현개발일기 2024. 3. 6.

■ Alpha Blending

기본적으로 게임 오브젝트들은 렌더링파이프라인을 통해 화면에 그려지게 되는데 Output Merger 단계에서 z-buffering을 통해 여러 사물의 렌더링 순서를 결정해준다. 이렇게 불투명한 오브젝트들은 z-buffering을 통해 그려준다면 별 문제가 없는데 반투명 물체를 그려줄 때는 문제가 생길 수 있다. 

 

뒤에있는 불투명한 오브젝트를 먼저 그려주고 앞에 있는 반투명한 오브젝트를 그려준다면 문제 없이 렌더링 된다.

하지만, 앞에있는 반투명 오브젝트가 그려지고 뒤에 있는 불투명한 오브젝트를 그려준다면 반투명 오브젝트가 그려지면서 z버퍼에 정보를 넘겨주게되어 뒤에 위치한 불투명한 오브젝트의 일부분이 잘리게 된다.

 

반투명한 물체가 아니라 하나의 Quad에 알파값을 갖고있는 텍스처를 적용한 뒤 투명처리된 오브젝트로 만든다고 해도 같은 문제가 발생하는데 이 문제를 해결하고자 다음과 같은 방법을 활용한다.

 

(1) 불투명(Opaque) 오브젝트를 먼저 그린다

 

(2) 반투명(Transparent) 오브젝트는 나중에 그린다.

 

(3) 반투명 오브젝트들끼리는 '멀리 있는 것'부터 '가까운 것'까지 차례대로 그린다.

 

위와 같이 알파값을 갖고있는 물체를 혼합해서 그려내는 것을 알파 블렌딩(Alpha Blending)이라고 한다.

 

■ 제작

 

블렌딩 이전에 기본 램버트(Labmert) 쉐이더를 적용한 텍스처이다.

 

이를 transparent처리하기 위해 앞서 공부했었던 transparent 태그로 수정했다.

 

 

위와 같이 투명도가 적용이 되어 Background와 조화롭게 블렌딩된 것을 볼 수 있다. 

 

하지만 아래와 같이 백페이스컬링(Backface Culling)으로 인하여 뒷면은 컬링 되고있다는 것을 볼 수 있다.

 

https://yjhdevelopdiary.tistory.com/161

 

[Math] 외적, 백페이스 컬링, 로드리게스 회전

■ 외적 내적 같은 경우 서로 같은 위치에 있는 요소끼리 연산을 하지만, 외적은 서로 다른 위치에 존재하는 요소만 사용한다. 예로 외적의 계산은 아래와 같다. [공식] 아래와 같이 벡터u와 벡터

yjhdevelopdiary.tistory.com

 

Default값이 cull back이기 때문에 일어나는 현상인데 뒷면도 렌더링해주기 위하여 이를 무시하고 cull off키워드를 추가해줬다.

 

양면 렌더링이 가능해졌다

 

여기서 끝이 아니다 우리 눈에 보이는 오브젝트는 알파가 정상적으로 적용이 되었으나 그림자는 또다른 문제이다.

 

쿼드(Quad) 오브젝트에다가 텍스처를 씌운 것이라서 그림자는 쿼드 형태로 여전히 나타나고 있다.

풀 모양의 그림자를 생성하기 위해선 아래와 같이 수정을 해줘야한다

 

(1) _Color 프로퍼티를 꼭 추가해줘야한다. 명시해주지 않으면 그림자가 생성 자체가 안된다.

(2) TransparentCutout 키워드와 AlphaTest 렌더링 순서를 정해준다.

(3) Fallback에다가 Cutout계열의 쉐이더를 추가해준다. 그렇지 아니하면 이상한 모양의 그림자가 생성된다

 

▼ 성공적으로 그림자가 맺어진 모습

 

[요약]

1. 불투명한 오브젝트들은 그저 계산되는 대로 그려주면 아무 문제가 없지만, 반투명 오브젝트들은 일단 불투명한 오브젝트가 다 그려질 때까지 대기하고 있어야만 한다.


2. 반투명 오브젝트들끼리 거리를 체크하는 연산을 추가해야 한다.


3. 반투명한 오브젝트는 뒤에서부터 그리게 되므로 앞에 커다란 반투명이 있으면 오히려 계산이 더 무거워지는 결과를 초래하게 된다


4. 디퍼드 렌더링 (Deferred Rendering)에서는 아예 반투명을 처리할 수 없어서, 포워드 렌더링(Forward Rendering)으로 반투명을 따로 그려줘야한다.

 

* 그래서 실무에선 반투명을 최대한 안쓰려고한다. 퍼포먼스에 악영향을 많이 끼치기 때문.

 

물론 최적화 방법에 대해서 많은 전문가분들이 연구를 하고 계시니 기업별로 최적의 상황에 맞춰 적용하고 있을지도 모른다. 하지만 기본적으로 위와 같은 이유 때문에 기본 쉐이더보다 연산이 많이 들어간다는 것은 변함이 없다.

728x90

'Computer Graphics > ShaderLab, HLSL' 카테고리의 다른 글

[ShaderLab] Dissolve  (0) 2024.03.06
[ShaderLab] 2Pass AlphaBlending  (1) 2024.03.06
[ShaderLab] Cubemap (with MaskMap)  (0) 2024.03.05
[ShaderLab] Diffuse Warping  (0) 2024.03.05
[ShaderLab] NPR - 2Pass, Fresnel  (0) 2024.03.04