2020년 11월 작성 버전.

배경.

Blend가 필요하기 때문에 투명한 오브젝트의 렌더링은 종종 많은 수의 OverDraw로 가득 차 있으며, 스택의 수가 많을수록 재질이 복잡할수록 OverDraw의 효율성 영향이 커집니다.

그러나 실제로 많은 투명 오브젝트가 완전히 투명하지는 않지만 많은 수의 픽셀이 완전히 불투명하거나 거의 불투명한 경우가 많습니다.

이 경우 Blend가 SrcAlpha, OneMinusSrcAlpha를 계속 설정하는 경우 이러한 픽셀이 뒤에 있는 픽셀을 완전히 가릴 것이라고 가정할 수 있습니다.

이 경우 이러한 Blend 상태에서 최종 이미지 효과에 거의 기여하지 않으므로 가려진 픽셀을 렌더링할 필요가 없습니다.

이를 통해 투명한 물체의 OverDraw를 줄이기 위해 관련 최적화가 수행될 것이라고 가정할 수 있습니다.

다음 다이어그램은 대부분의 픽셀이 완전히 불투명하고 뒤에 있는 개체가 가려지지만 주변 픽셀이 투명하다는 것을 나타냅니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6011e166-3152-4e14-8d71-4027511c117c/Untitled.png

여기서 PreZOff, PreZOn은 OpenGL ES 기반 패키지입니다. On은 Transparent DepthPre Pass를 켰다고, Off는 Transparent DepthPre Pass를 닫았다고 정의 합니다.

기술 원리.

배경의 설명에 따라 투명도가 불투명한 픽셀에 대해 깊이를 미리 작성하기만 하면 됩니다.

그런 다음 이러한 투명 오브젝트를 실제로 렌더링할 때 Early-Z 메커니즘으로 인해 계산이 필요하지 않은 픽셀을 조기에 제거하여 OverDraw를 줄일 수 있습니다.

예를 들어 다음 시나리오와 같이 두 개의 투명 오브젝트가 있습니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/fe4903aa-b8c7-4466-af30-41ebd6ca71fb/Untitled.png

일반적으로 녹색 개체는 다음과 같이 빨간색 개체를 다시 그립니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bdfb26d7-1404-44b1-8cab-9d5eace21c52/Untitled.png

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e5bbf2c9-d834-4874-adea-a1d77bdeed27/Untitled.png

Transparent DepthPre Pass를 켜면 다음과 같이 깊이를 그려나가려고 합니다.