복잡한 3D 장면에서 알파 블렌딩을 올바르게 구현하는 방법은 무엇입니까? 드문 경우가 있습니다.

나는이 질문에 대답하기가 약간 쉽지만 나를 미치게합니다. 좋은 알파 블렌딩 메커니즘이 처리해야 할 상황이 너무 많으며 각 알고리즘에 대해 누락 된 것이 있다고 생각할 수 있습니다.

지금까지 내가 본 방법은 다음과 같습니다.

  • 우선 깊이별로 객체를 정렬하는 방법에 대해서는 객체가 단순한 모양이 아니기 때문에 실패합니다. 곡선이 있고 서로 반복 될 수 있습니다. 어느 쪽이 카메라에 더 가까운 지 항상 알 수는 없습니다.

  • 그런 다음 삼각형 정렬에 대해 생각했지만 이것도 실패 할 수 있습니다. 어떻게 구현하는지 잘 모르겠습니다. 두 개의 삼각형이 서로 통과하는 문제를 일으킬 수있는 드문 경우가 있습니다. 다시 어느 쪽이 더 가까운 지 알 수 없습니다.

  • 다음은 깊이 버퍼를 사용하는 것이 었습니다. 적어도 우리가 깊이 버퍼를 가지고있는 주된 이유는 내가 언급 한 정렬 문제로 인한 것이지만 지금은 또 다른 문제가 발생합니다. 객체가 투명 할 수 있으므로 단일 픽셀에서 이상의 객체가 표시 될 수 있습니다. 픽셀 심도를 어떤 객체에 저장해야합니까?

  • 그런 다음 가장 정면의 객체 깊이 만 저장할 수 있다고 생각하고 그 픽셀을 사용하여 다음 그리기 호출을 어떻게 혼합 해야하는지 결정합니다. 그러나 다시 문제가있었습니다. 중간에 단단한 평면이있는 두 개의 반투명 평면에 대해 생각해보십시오. 마지막에 솔리드 평면을 렌더링하려고했는데 가장 먼 평면을 볼 수 있습니다. 해당 픽셀에 대해 하나의 색상 만 남을 때까지 두 평면마다 병합하려고합니다. 분명히 위에서 설명한 것과 같은 이유로 정렬 방법을 사용할 수도 있습니다.

  • 마지막으로 내가 일할 수 있다고 생각하는 유일한 것은 모든 객체를 다른 렌더링 대상으로 렌더링 한 다음 해당 레이어를 정렬하고 최종 출력을 표시하는 것입니다. 그러나 이번에는이 알고리즘을 어떻게 구현할 수 있는지 모르겠습니다.



답변

짧은 대답

깊이 필링을 살펴보십시오 . 내 연구에서 여러 렌더링 패스가 필요하기 때문에 계산 비용이 많이 들지만 최선의 대안 인 것 같습니다. NVIDIA 의 또 다른 최신의 빠른 구현 이 있습니다.

긴 답변

그건이다 어려운 질문입니다. 내가 읽은 대부분의 책은 주제에 대해 탈지하고 다음과 같이 둡니다.

모든 불투명 한 오브젝트를 렌더링 한 다음 투명 오브젝트를 위에서 아래로 혼합합니다.

중심점을 기준으로 객체를 정렬하는 확실한 접근 방식 이 올바른 정렬 순서를 보장 하지 않기 때문에 수행하는 것보다 쉽습니다 .

화가의 알고리즘 이 일반적인 경우에 작동하지 않고 깊이 버퍼 가 필요한 이유는 정확히 같은 문제 입니다.

그 말로, 내가 언급 한 책 중 하나는 몇 가지 해결책을 언급합니다.

  • Depth Peeling- 가장 가까운 조각뿐만 아니라 n 번째로 가장 가까운 조각을 제공하여 깊이 버퍼 제한을 극복하는 멀티 패스 솔루션입니다. 가장 큰 장점은 투명 개체를 임의의 순서로 렌더링 할 수 있으며 정렬 할 필요가 없다는 것입니다. 여러 패스로 인해 비용이 많이들 수 있지만맨 위에 제공한 링크 는 성능을 향상시키는 것으로 보입니다.

  • 스텐실 라우팅 된 K- 버퍼 -스텐실 라우팅을 사용하여 지오메트리 패스 당 픽셀 당 여러 개의 조각 레이어를 캡처합니다. 주요 단점은 조각을 사후 처리 단계에서 정렬해야한다는 것입니다.

또한 문제에 대한 하드웨어 솔루션에 대해서도 언급하지만 실제로 사용할 수 있다고 생각하지 않습니다.

  • F-Buffer- 멀티 패스 렌더링을위한 래스터 화 순서 FIFO 버퍼. 그럼에도 불구하고 잘 읽고 소개하면 투명도 정렬 순서 문제와 현재 솔루션에 대해 조금 이야기합니다.

완벽한 결과를 제공하지는 않지만 다른 것보다 나은 다른 해결 방법 :

  • 모든 불투명 한 객체를 렌더링 한 후 투명 객체에 대해서는 Z- 버퍼 테스트를 계속 사용하고 Z- 버퍼 쓰기는 비활성화하십시오 . 잘못된 정렬에서 일부 아티팩트를 얻을 수 있지만 최소한 모든 투명한 오브젝트가 표시됩니다.

위의 F- 버퍼 백서를 인용하십시오.

가장 간단한 해결책은 부분적으로 투명한 각 다각형을 완전히 독립적으로 렌더링하는 것입니다 (즉, 다음 다각형으로 진행하기 전에 모든 패스를 렌더링 함). 이 솔루션은 일반적으로 발생하는 상태 변경 비용으로 인해 엄청나게 비쌉니다. 또는 응용 프로그램 또는 음영 처리 라이브러리는 겹치지 않는 다각형 만 함께 렌더링되도록 다각형을 그룹화 할 수 있습니다. 대부분의 경우이 솔루션은 소프트웨어가 다각형의 화면 공간 분석을 수행해야하기 때문에 매력적이지 않습니다.


답변

정답은 # 1입니다. 모든 것을 심도별로 정렬하고 렌더링합니다 (심도 쓰기는 끄고 테스트는하지 않음). “것”은 무엇입니까?

각 “물건”은 볼록한 물체 여야합니다. 자체 오버랩 할 수 없습니다. 오목한 물체가 있으면 볼록한 조각으로 나누어야합니다.

이다 투명한 장면을 렌더링의 표준 방법. 침투 사건을 해결합니까? 아니요. 깊이 순서를 결정할 수없는 3 개의 객체가있는 경우를 해결합니까? 아닙니다. 중앙 깊이에 더 가까운 작은 물체와 겹치는 긴 물체가있는 경우를 해결합니까? 아니.

그러나 그것은 충분히 잘 작동 합니다 . 게임은 깊이 필링을 사용하지 않습니다. 스텐실 라우팅 된 k- 버퍼를 사용하지 않습니다. F- 버퍼를 사용하지 않습니다. 왜? 이런 것들이 엄청나게 느리기 때문입니다.

표준 방법으로 아티팩트를 얻을 수 있습니다. 그러나 적어도 게임은 합리적으로 진행됩니다.

DX11 또는 더 나은 하드웨어로 자신을 제한하려는 경우 적절한 정렬과 혼합을 구현하는 방법이 있습니다. 속도는 느리지 만 이전 기술만큼 느리지는 않습니다. 그리고 아티팩트를 유발할 수있는 깊이 필링과 달리, 이것은 샘플 정확합니다. 또한 알고리즘의 성능은 일반적으로 조각 별 (각 조각 내에서 중첩 당 어느 정도)입니다. 따라서 많은 투명한 물건을 그리지 않으면 성능이 최소화됩니다.

이 기술 에 스파이 피 이름 이 있는지는 모르지만 GL4.2 이전의 구현은 여기에서 찾을 수 있습니다. D3D11 버전은 여기에서 찾을 수 있습니다 (파워 포인트, PPSX, 리브레 호환).