2016-11-28 4 views
1

OpenGL ES 2.0에는 GL_ALPHA_TESTglAlphaFunc이 없기 때문에 투명한 개체에 대한 깊이 필링을 구현하는 일반적인 방법은 분명히 작동하지 않습니다. 이론적으로 필자의 조각 쉐이더에서 if (alpha < 1) discard;을 사용할 수는 있지만 지점이기 때문에 너무 느릴 수 있습니다.OpenGL ES 2.0에서 깊이 필링을 구현하는 좋은 방법이 있습니까?

다른 접근 방법이 있습니까?

누구나 성능이 if (alpha < 1) discard; 인 사람은 전면에서 전면 렌더링에서 오버 드로 비용을 수용하는 것과 비교해 봤습니까?

편집 : 위의 순수한 알파 테스트를 설명하는 것처럼 보이지만 내 목표는 실제로 깊이 필링 또는 초기 z와 유사한 것을 달성하는 것입니다. 해결해야 할 문제는 백 투방 렌더링을 사용하면 불투명 한 픽셀에 대해 많은 양의 오버 드로가 발생한다는 것입니다. 그래서 저는 두 번의 패스로 렌더링하고 싶습니다. 알파 기능이 ==1 ("깊이 필링"또는 "초기 z"패스) 인 상태에서 알파 테스트를 사용하여 전면에서 후면으로 이동합니다. 두 번째는 알파 블렌딩과 깊이 테스트가 켜져있는 상태에서 앞뒤가 맞습니다.

+0

깊이 껍질을 벗기를 원하십니까? 깊이 필링은 순서에 독립적 인 투명성을 얻기위한 기술이지만 이미 백 투방 렌더링을하고 있다고합니다. 대신 알파 테스트를 하시려는 것이 아닌가 궁금합니다. – Columbo

+0

네 말이 맞아. 내 목표는 깊이 필링 (또는 초기 z)과 매우 비슷하지만 알파 테스트와 같은 것을 원합니다. 프런트 - 투 - 백 또는 프론트 - 투 - 프런트 렌더링에는 아무런 문제가 없지만, 백 - 투 - 프런트 렌더링에서는 성능이 크게 저하됩니다. 무거운 장면에서 평균 8x 오버 드로를 얻을 수 있습니다. 소량의 픽셀 만 반투명 한 경우 수천만 개의 픽셀 셰이더 호출이 낭비됩니다. 따라서 알파 테스트를 통해 첫 번째 패스에서 전방 투수를하고 깊이 버퍼를 채우고 두 번째 패스에서 뒤에서 앞으로 그립니다. 이번에는 깊이 테스트와 알파 블렌딩을 사용합니다. –

답변

3

일반적으로 discard을 많이 사용하지 마십시오. 이것은 초기 zs 테스트를위한 일반적인 목적의 대체물은 아니며 픽셀 간의 데이터 종속성에 대한 끔찍한 문제를 야기합니다 (늦은 -z까지 확신을 갖고 깊이 값을 분석 할 수는 없습니다. 셰이더는 실제로 프래그먼트를 버리거나 버릴 것입니다).

유즈 케이스가 무엇인지 정확하게 말하지는 않지만 불투명 한 스프라이트의 2D 렌더링 레이어 인 경우 스프라이트 당 기하학을 두 배치로 조정해야합니다. 실제로는 불투명 한 것으로 깊이 테스트를 사용할 수 있습니다 블렌딩이 비활성화되어 (전면에서 후면으로 렌더링) 블렌딩 된 내용이 두 번째 패스에서 그립니다 (깊이 테스트가 활성화되어 있지만 깊이 쓰기가 비활성화 된 상태에서 앞에서 렌더링).

이 블로그는 기술의 좋은 개요입니다 : 콘텐츠 알파 난 당신이 고통을하는 적 방법으로 공격하려고하는 공포 후 테스트 임의의 3D 컨텐츠는

경우 당신은 폐기가 실제로 그렇게 효율적이지 않으므로 노력합니다.

+0

필자의 경우는 실제로 2D이며, 불투명 한 부분에 대한 기하학을 사용하는 것이 대안이지만, 링크의 예보다 훨씬 복잡합니다. 내용은 2D이긴하지만 스프라이트가 아니라 복잡한 2D 메쉬이기 때문에 임의의 3D 컨텐츠로 사용할 수 있습니다. 이 메쉬에 대한 "초기 z"지오메트리 생성은 매우 어려울 것입니다. 수동으로 그리는 것도 많은 노력입니다. 나는 파손 경로를 테스트 할 것이고 결과가 만족스럽지 않다면 불투명 한 기하학을 어떻게 가는지 알아 내려고합니다. –

+0

그래, 사전 처리 할 수단이없는 임의의 메쉬에 대해서는 그 기술이 쉽게 작동하지 않는다. 나는 텍스처를 플랫폼에서 실시간으로 전처리하려하지 않았다.한 단어 나 경고는 GPU 공급 업체 및 하드웨어 개정판에서 성능에 대한 '파기'의 영향이 다소 불규칙 할 수 있으므로 몇 가지 장치에서 시험해 볼 수 있습니다. – solidpixel

+0

그래서 몇 가지 실험을했는데 제 경우에는 '버림'으로 인해 성능이 약간 향상되었지만 충분하지 않았습니다. 깊이 테스트를 위해 맞춤형 지오메트리 사용 –