왜 픽셀 쉐이더로 프레임 버퍼 나 뎁스 버퍼에서 직접 읽을 수 없습니까?


18

픽셀 셰이더에서 프레임 버퍼 또는 뎁스 버퍼를 샘플링 할 수 있으면 매우 유용한 기능입니다. 현재 픽셀 뒤에있는 것의 깊이 나 색상을 알 수 있다고해도 유용 할 것입니다.

OpenGL과 DirectX 모두 왜 이렇게 할 수 없습니까? 하드웨어 제한이있을 것으로 예상했지만 알파 블렌딩은 계산을 블렌딩하기 위해 프레임 버퍼의 색상을 사용하고 Z 테스트는 현재 위치에서 깊이 버퍼를 샘플링합니다. 왜이 값들을 우리에게 직접 노출시키지 않겠습니까? 앞으로 이것을 볼 수 있을까요?

답변:


20

그것은 하드웨어 제한. 프래그먼트 셰이더는 프로그래밍 가능한 파이프 라인의 일부이지만, 대상 버퍼와의 최종 색상 혼합은 현재 광범위하게 사용 가능한 / 제품 하드웨어에서 프로그래밍 할 수 없습니다 (블렌드 상태를 통해 구성 가능하지만 임의의 값을 쓸 수는 없음) GPU 내장 블렌드 작업을 대체하는 코드).

이를 위해 하드웨어가 구축되지 않은 이유는 아마도 GPU가 엄청나게 평행하다는 사실과 관련이있을 것입니다. 한 번에 많은 조각을 처리합니다. 이러한 조각 중 일부는 최종적으로 대상 버퍼 내에서 서로 상호 작용할 수 있지만 조각 처리의 비동기 특성으로 인해 조각이 처리되고 최종 색상이 방출 된 후까지 어떻게 처리되는지 알 수 없습니다. 항상 결정 론적으로 일어나는 것은 아닙니다.

최종 프레임에서 픽셀 A가 픽셀 B 뒤에 있다고해서 픽셀 A가 항상 프래그먼트 처리를 완료하고 특히 여러 렌더링 프레임에서 B 전에 대상에 기록된다는 의미는 아닙니다. 따라서 픽셀 B를 처리하는 동안 대상 버퍼에서 읽은 값이 항상 픽셀 A 인 것은 아니며 때로는 명확한 값이됩니다.

따라서 프래그먼트 단계에서 직접 대상 버퍼 읽기를 허용하지 않는 것은 블렌드 스테이지를 완전히 만드는 데있어 실제 기술적 인 제한보다 읽기에서 잠재적으로 결정적이지 않은 결과를 얻음으로써 셰이더 프로그래머가 발을 쏠 수 없도록하는 것과 훨씬 더 관련이 있다고 생각합니다. 프로그래밍 가능. 읽기 작업을 엄격하게 제어하여 (예 : 깊이 테스트) GPU는 읽기 값으로 수행되는 작업이 어떤 의미가 있는지 확인합니다.

즉, 비용 / 혜택이 진행될 수도 있습니다. GPU 파이프 라인을 프로그래밍 가능하게하면 칩 설계가 다소 복잡해지며 다른 기능에 비해 대상 버퍼 읽기 요구 / 요청이 상대적으로 낮습니다.


이를 확장하기 위해 프레임 버퍼 액세스 속도가 느린 역사적 이유는 명령이 매우 파이프 라인이기 때문입니다. 주어진 프레임 버퍼 픽셀에 액세스하려면 다른 모든 파이프 라인을 비워 쿼리 된 픽셀과 관련된 렌더링을 완료 할 때까지 현재 파이프 라인을 정지시킵니다. 완전히 병렬이 아닌 GPU의 경우에도 각 쿼리에 대해 전체 파이프 라인을 플러시하는 것은 좋지 않은 생각입니다. 의심 할 여지없이 현재 프로그래머블 하드웨어의 세계에서는 상황이 약간 다르지만 비슷한 원리가 적용되기를 기대합니다.
Kylotan

4

성가신 반면 하드웨어 제조업체는 렌더링 프로세스를 다양하고 투명한 방식으로 최적화 할 수있는 유연성을 제공합니다.

예를 들어, PowerVR 하드웨어 (확실히 오랜 시간 동안 사용되지 않았 음)는 렌더링 될 전체 장면이 제출 될 때까지 기다린 다음 painters 알고리즘을 사용하여 자동 심도 정렬을 수행하며 실제로는 깊이 버퍼. 화면을 타일로 나누고 차례로 타일을 렌더링합니다.


4

다음과 같은 이유로 픽셀 셰이더가 색상 및 깊이 버퍼에서 읽을 수 없습니다.

픽셀 A와 B는 하드웨어에서 정확히 같은 순간에 음영 처리 될 수 있지만 B는 궁극적으로 ( "후") 픽셀 A 위에 렌더링됩니다.

하드웨어가 B보다 먼저 A를 가리도록 보장하면 하드웨어의 일부는 아무것도하지 않고 A는 음영 처리되고 하드웨어의 일부는 아무것도하지 않고 B는 음영 처리됩니다.

상상할 수있는 최악의 경우, 음영 처리 한 모든 픽셀이 서로 위에 렌더링되고 수천 개의 GPU 스레드 (하나는 제외하고 모두)가 유휴 상태입니다. 이 스레드는 참을성있게 픽셀 A, B, C를 음영 처리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.