2012-01-12 4 views
0

모든 형상이 하나의 VBO (투명 + 투명하지 않음)에 저장됩니다. 형상을 정렬 할 수 없습니다. 데이터 색상을 잃지 않고 glsl에서 깊이 버퍼에 쓰는 것을 어떻게 비활성화 할 수 있습니까?glsl에서 깊이 버퍼에 쓰기 사용 안 함

+0

다음 규칙에서 vbo의 폴리곤을 단락시켜야합니다 : 투명 폴리곤이 아닌 것을 감지하고 VBO, 그리기 시작 부분에서 그를 움직여야합니다. 그렇지? –

답변

5

제대로 이해했다면 불투명 및 투명 오브젝트를 모두 그리기 때문에 깊이 쓰기를 사용하지 않으려합니다. GLSL 내에서 그런 식으로 작동하지 않는다는 것 외에도 원하는 경우 GLSL이 원하는 것을 만들어 내지 못합니다.

ad hoc을 방금 작성한 경우 투명 오브젝트 뒤에 오는 불투명 오브젝트는 z 순서에 관계없이이를 겹쳐 쓰게됩니다.

  1. 모든 불투명 한 형상을 그리기 깊이 쓰기 활성화하고 깊이 테스트
  2. :

    은 당신이 정말로 원하는 것은 이것이다. 당신이 할 수있는 경우, 대략 정렬 (대략입니다!) 주문, 가장 가까운 물건을 먼저.

  3. 안 깊이가 계속 기록 깊이 테스트는
  4. 반대 방향으로 정렬 투명 개체를 그립니다 혼합 사용 가능, 그 첫번째 멀리 떨어져 있습니다. 이렇게하면 투명한 오브젝트가 불투명 한 지오메트리로 닫히고 블렌딩이 올바르게 수행됩니다. (? 정말 당신이 할 수없는 이유 아무 이유도 없지만) - 그것 때문에 약간 느립니다 어떤 이유로, 당신은 불투명 형상을 정렬 할 수 없습니다, 경우는

, 결코 마음 조각을 추려 내지 않지만 동일한 이미지를 생성합니다.

투명도 지오메트리를 정렬 할 수없는 경우 몇 개의 투명한 개체가 겹치는 경우 잘못된 결과를 예상해야합니다. 이것은 눈에 띄지 않을 수도 있습니다 (특히 순서가 "임의", 즉 프레임 단위로 변경되면 매우 눈에 띄게됩니다. 그렇지 않으면 잘못되었지만 실제로는 그만큼 벗어날 수 있습니다).

datenwolf가 이미 지적했듯이 여러 개체가 하나의 VBO에 있다는 사실은 사용자가 원하는 순서대로 여러 하위 집합을 그릴 수 없다는 것을 의미하지 않습니다. 결국, VBO는 일부 정점만을 보유합니다. 어떤 순서로 그룹을 그리는 것은 당신에게 달려 있습니다.

+0

클라이언트 코드에 왜 이러한 부담이 발생하는지 이해할 수 없습니다. 조각 처리를 자동으로 수행 한 후 수천 번 더 쉽게 수행 할 수 있으며 CPU에서의 계산을 포함하지 않고 성능을 크게 향상시킵니다. OpenGL이 점점 더 어리석은 표준을 쓸 때 두뇌를 사용하지 않는다고 점점 더 확신하고 있습니다. – spectre

+0

@ lukasz1985 : 왜 그런 부담이 있는지는 당신이 한 가지 깊이 값만 가지고 있다는 것입니다.투명한 오브젝트가있는 장면은 오브젝트가 겹치는 부분마다 여러 개의 깊이가 있지만 하나만 유지할 수 있습니다 (가장 가까운 부분은 불투명합니다). 투명 오브젝트의 경우 주어진 단편에서 그려지는 Z 순서가 잘 정의되어 있지 않습니다 (OpenGL은 선험적으로 알 수 없습니다). 결과는 크게 중요합니다. 따라서 응용 프로그램 수준에서 정렬해야합니다. 원자 연산과 "뚱뚱한"버퍼를 사용하면, 당신이 상상할 수있는 "천 번 더 쉬운"방법을 수행하는 것이 가능하지만, 이것은 엄청난 요구를 가지고 있습니다 ... – Damon

+0

... 메모리와 대역폭 모두에서 매우 실행됩니다 최근의 하드웨어를 사용하는 것이 아니라 (예 : [here] (http://developer.download.nvidia.com/SDK/10/direct3d/Source/StencilRoutedKBuffer/doc/StencilRoutedKBuffer.pdf)를 참조하십시오. 그런 것). OpenGL은 라인의 최상부에 있지 않은 하드웨어도 고려해야하며 두 자리의 기가 바이트 비디오 메모리를 사용할 수없는 경우에도 여전히 작동해야합니다. 그러므로 그것은 불행하게도 진화 된 모든 것이 될 수는 없습니다. – Damon

0

수 없습니다.

지오메트리를 정렬 할 수 없습니다.

왜? VBO 하나에 모두 있기 때문에 생각하십니까? 그렇다면 좋은 소식이 있습니다. 버퍼 객체의 하위 집합에서 완전히 그릴 수 있습니다.