OpenGL ES 2.0에는 GL_ALPHA_TEST
및 glAlphaFunc
이 없기 때문에 투명한 개체에 대한 깊이 필링을 구현하는 일반적인 방법은 분명히 작동하지 않습니다. 이론적으로 필자의 조각 쉐이더에서 if (alpha < 1) discard;
을 사용할 수는 있지만 지점이기 때문에 너무 느릴 수 있습니다.OpenGL ES 2.0에서 깊이 필링을 구현하는 좋은 방법이 있습니까?
다른 접근 방법이 있습니까?
누구나 성능이 if (alpha < 1) discard;
인 사람은 전면에서 전면 렌더링에서 오버 드로 비용을 수용하는 것과 비교해 봤습니까?
편집 : 위의 순수한 알파 테스트를 설명하는 것처럼 보이지만 내 목표는 실제로 깊이 필링 또는 초기 z와 유사한 것을 달성하는 것입니다. 해결해야 할 문제는 백 투방 렌더링을 사용하면 불투명 한 픽셀에 대해 많은 양의 오버 드로가 발생한다는 것입니다. 그래서 저는 두 번의 패스로 렌더링하고 싶습니다. 알파 기능이 ==1
("깊이 필링"또는 "초기 z"패스) 인 상태에서 알파 테스트를 사용하여 전면에서 후면으로 이동합니다. 두 번째는 알파 블렌딩과 깊이 테스트가 켜져있는 상태에서 앞뒤가 맞습니다.
깊이 껍질을 벗기를 원하십니까? 깊이 필링은 순서에 독립적 인 투명성을 얻기위한 기술이지만 이미 백 투방 렌더링을하고 있다고합니다. 대신 알파 테스트를 하시려는 것이 아닌가 궁금합니다. – Columbo
네 말이 맞아. 내 목표는 깊이 필링 (또는 초기 z)과 매우 비슷하지만 알파 테스트와 같은 것을 원합니다. 프런트 - 투 - 백 또는 프론트 - 투 - 프런트 렌더링에는 아무런 문제가 없지만, 백 - 투 - 프런트 렌더링에서는 성능이 크게 저하됩니다. 무거운 장면에서 평균 8x 오버 드로를 얻을 수 있습니다. 소량의 픽셀 만 반투명 한 경우 수천만 개의 픽셀 셰이더 호출이 낭비됩니다. 따라서 알파 테스트를 통해 첫 번째 패스에서 전방 투수를하고 깊이 버퍼를 채우고 두 번째 패스에서 뒤에서 앞으로 그립니다. 이번에는 깊이 테스트와 알파 블렌딩을 사용합니다. –