2009-06-27 4 views
8

처음입니다. 오늘 앉아서 OpenGL을 가르쳐주세요. 하지만 나는 대답을 찾을 수없는 질문에 직면 해있다. 왜 깊이 테스트가 OpenGL의 반투명 오브젝트와 호환되지 않는지 궁금합니다. 설명서에서는 깊이 테스트를 해제 한 다음 반대 거리 순서로 객체를 그려야하며 블렌딩이 제대로 작동해야한다고 제안하는 것 같습니다.OpenGL에서의 Z- 깊이 테스트

그러나 왜 OpenGL은 역방향 거리 순서에서 가장 먼 것을 찾아 내고 이것을 수행하는 것과 동일한 깊이 테스트를 사용할 수 없습니까? 프레임 워크의 한계일까요? 아니면 그래픽 하드웨어에서 효율적으로 할 수있는 것과 관련이 있습니까?

궁금한 점이 있습니다. 여기 누군가가 해명되기를 바랍니다.

답변

11

좋은 질문입니다.

간단히 대답하면 Z 버퍼는 프레임 버퍼의 각 픽셀에 대해 단일 값만 저장합니다. "보통"의 조작 모드 (불투명 한 오브젝트의 경우, GL_DEPTH_TEST이 유효로 된 경우, glDepthFuncGL_LESS로 설정), 그 값은 그 픽셀에 맵하는 가장 가까운 프래그먼트의 깊이가됩니다.

프레임 버퍼는 "벙어리 (dumb)"장치입니다. 모든 조각은 다른 모든 조각과 독립적으로 래스터 화되고 깊이 테스트되며이를 생성 한 기본 개념과 분리됩니다. 따라서 "자동 투명성"기능을 구현하는 데 필요한 선행 프리미티브, 심도 정렬 등에 대한 정보는 얻을 수 없습니다.

심도 정렬에 대한 도움말은 "장면 그래프"를 참조하십시오. OpenGL에서 제공하는 기본 T & L 항목을 능가하는 "상위 레벨"기능을 추가하는 라이브러리입니다.

희망이 도움이됩니다.

2

깊이 테스트를 사용 중지하는 것에 대해 들어 본 적이 없습니다. 투명 오브젝트의 깊이 테스트가 필요합니다.

투명 객체가 z 버퍼에 쓰는 것을 원하지 않는 이유는 나중에 그려진 객체 뒤에 구멍이 나기 때문입니다.

+0

내가 왜 이것이 Open-GL을 제안했는지에 따라, 투명 오브젝트 뒤에 그려지는 모든 것이 투명하지만 그 뒤에 투명 오브젝트를 완전히 가릴 것이므로 분명히 의도 된 것이 아니기 때문에이 투표에 대한 이유가 궁금합니다. – Blindy

+1

그게 핵심입니다. 깊이있는 테스팅이 가능하지만 깊이 쓰기는 비활성화되어 있습니다. 그런 식으로 투명한 물건은 여전히 ​​앞에있는 불투명 한 물건으로 가려져 있습니다. –

+0

마지막으로 투명한 오브젝트를 그립니다. 나는 그가 역 순서를 언급하고 z 버퍼링에 대해 질문했기 때문에 그가 이미 그것을 알고 있다고 가정했다. – David

3

OpenGL은 깊이 버퍼에 한 번에 하나의 픽셀을 쓰고 OpenGL에 표시되는 순서대로 픽셀을 생성하는 삼각형을 렌더링합니다. OpenGL은 심도있는 삼각형 정렬을하지 않으며, 해당 애플리케이션에 가장 효율적인 방식으로이를 관리하는 것은 호출 프레임 워크에 달려 있습니다. 많은 삼각형을 렌더링하는 가장 효율적인 방법은 버텍스와 인덱스의 인접한 버퍼에 이들을 저장하는 것이므로 API가 모든 모든 프레임을 정렬하는 것에 대해 걱정해야한다면, 속도와 유연성의 목적입니다. 상황이 훨씬 느립니다.

또한 재료는 API에서 삼각형과 직접 연관되어 있지 않으므로 OpenGL은 실제로 어떤 것이 투명하고 어떤 것이 실제로 렌더링 될 때까지 불투명하다는 것을 알 수있는 방법이 없습니다.

가장 좋은 방법은 모든 불투명 한 삼각형을 먼저 그린 다음 모든 투명/알파 혼합 삼각형을 마지막으로 그립니다. 일반적으로 깊이 테스트를 사용하도록 설정하고 깊이 쓰기를 사용하지 않도록 설정하고 정확한 블렌딩을 위해 투명 삼각형을 뒤에서 앞으로 정렬합니다. 보통 이것을 처리하는 방법은 여러 가지 버킷이있는 씬 그래프를 만드는 것입니다. 장면 그래프에 삼각형을 추가하면 올바른 순서로 렌더링 될 적절한 버킷으로 자동으로 구분됩니다.