2011-03-03 2 views
1

iOS에서 GL_ALPHA_TEST의 성능이 매우 좋지 않은 것처럼 보입니다. 견적하려면 Apple :OpenGL ES 1.1에서 GL_ALPHA_TEST 대체 (쉐이더 없음)

그래픽 하드웨어는 조각의 색상 값을 계산하기 전에 그래픽 파이프 라인의 초기에 깊이 테스트를 자주 수행합니다. 응용 프로그램이 OpenGL ES 2.0 조각 쉐이더에서 OpenGL ES 1.1 또는 discard 명령어의 알파 테스트를 사용하는 경우 일부 하드웨어 깊이 버퍼 최적화를 비활성화해야합니다. 특히 조각 조각을 볼 수 없기 때문에 조각의 색상을 완전히 계산하여 폐기해야 할 수 있습니다.

알파 테스트를 사용하거나 픽셀을 없애려면 버리는 방법 대신 α가 0 인 알파 블렌딩을 사용하는 것이 좋습니다. 이는 Z- 버퍼 최적화를 유지하면서 프레임 버퍼 컬러에 대한 기여를 효과적으로 제거합니다. 이렇게하면 깊이 버퍼에 저장된 값이 변경되므로 투명한 기본 요소를 뒤에서 앞으로 정렬해야 할 수 있습니다.

알파 테스트 또는 discard 명령을 사용해야하는 경우 필요하지 않은 프리미티브를 처리 한 후 장면에서 이러한 개체를 개별적으로 그립니다. 결과가 사용되지 않는 계산을 수행하지 않으려면 명령어를 조각 쉐이더의 초기에 배치하십시오.

궁금한 점은 "알파 강제로 알파 블렌딩을 사용하십시오"라는 것이 정확히 무엇을 의미합니까? 어떻게 이것을 할 수 있습니까? 또는 알파 값에 따라 픽셀을 생략하거나 숨길 수있는 다른 방법이 있습니까?

텍스쳐 컴 바이 너 또는 다양한 블렌드 모드 (glBlendFuncSeparateOES 포함) 사용을 고려했습니다. 그러나 아무 것도 그 일에 맞지 않습니다. 별도의 알파 텍스처가 있고 텍스처 조합을 사용하면 작업 할 수 있다고 생각합니다. 그래도 텍스쳐가 하나만있는 것을 선호합니다.

답변

1

문제는 심오하며 깊이 버퍼에 연결됩니다. 셰이더 코드에서 알파를 0으로 설정할 수는 있지만 깊이 조각을 출력하므로 알파 테스트를 사용하는 이유에 따라 부분적으로 만 해결할 수 있습니다. 알파와 스케일을 많은 수로 바이어스 (쉐이더 브랜치를 피하기 위해) 한 다음 클램핑하면 뚜렷한 알파 테스트 에지를 얻을 수 있지만 투명 픽셀은 여전히 ​​z 버퍼를 채 웁니다. 이것이 알파 테스트를 사용하는 이유라면 여전히 더 나아지지 않습니다. 셰이더의 핵심 문제를 해결할 수는 없습니다. 이것을 최소화하기 위해 내용을 조정할 수 있으며 불투명 한 테스트되지 않은 z를 그리고 알파 테스트 된 투명도를 마지막으로 수행 할 수 있습니다. 이것이 z에 미치는 영향에 대한 세부 사항은 플랫폼마다 매우 다를 수 있습니다. 일부 플랫폼에서는 초기 z 및 대략 z와 같은 zbuffer 최적화가 영구적으로 비활성화 될 때까지 취소 할 수 있으므로 알파 테스트 지연으로 성능을 얻을 수는 있지만 실제로 구현 세부 사항에 달려 있습니다.

투명 조각을 최소화하려면 아트를 조정하고 가능한 경우 렌더링이 가능한 경우 알파 테스트를 사용하십시오.

버려지는 기능이있는 경우 쉐이더의 끝에서 일정한 알파 테스트를 사용하면 반 직관적 일 수 있지만 일부 구현은이 알파 테스트 삭제를 최적화하여 쉐이더 브랜치보다 나은 고정 기능 하드웨어를 사용합니다 (일부 플랫폼에서). 다시 말하지만 실제로는 GPU 스레드 흐름 제어의 정교함에 달려 있습니다. 효율적인 분기 기능을 갖춘 미래의 플랫폼은 이전 버전을 통해 이점을 얻을 수 있습니다. 기본적으로 플랫폼에 따라 다르며 향후 변경 될 숨겨진 구현 최적화를 개발하기위한 방법을 탐색하려고합니다.

+0

답장을 보내 주셔서 감사합니다. 셰이더 기반 솔루션에 대한 아주 잘 설명되어 있습니다. 그러나 내가 말했듯이 셰이더를 전혀 지원하지 않는 OpenGL ES 1.1을 목표로하고 있습니다 (http://www.khronos.org/registry/gles/ 참조). – kloffy