2010-12-07 6 views
6

새로운 쉐이더 모델에서 대상 프레임 버퍼의 픽셀 값을 다시 읽는 지원이 있는지 궁금합니다. 나는이 기능이 드로잉 파이프 라인의 나중에 (프로그래밍 할 수없는) 단계에서 완료되었다고 생각하며,이 기능이 프로그래머블 파이프 라인에 추가 될 수 있기를 희망했다.쉐이더 프레임 버퍼 리드 백

텍스처 바인딩 된 프레임 버퍼로 그려진 다음이 텍스처를 셰이더로 보낼 수 있다는 것을 알고 있습니다. 동일한 기능을 구현하는보다 우아한 방법을 기대했습니다.

답변

4

는 프레임 버퍼 액세스가 논리적으로 프래그먼트 쉐이더에서 별도의 단계이므로에서 프레임 버퍼를 읽고 조각 셰이더는 불가능합니다. Andrew의 질문에 답하는 이유는 성능과 그래픽 파이프 라인의 주문 요구 사항을 조합 한 것입니다. 렌더링 파이프 라인이 정의되는 방식에 따라 프레임 버퍼 혼합 작업은 파이프 라인 시작 부분에있는 삼각형/프리미티브와 동일한 순서로 이루어져야합니다 (MUST). 반면 조각 쉐이더는 어떤 순서로도 발생할 수 있습니다. 따라서 GPU는 별도의 단계를 거침으로써 프리젠 테이션을 사용할 수있을 때 가능한 한 빨리 조각 쉐이더를 자유롭게 실행할 수 있습니다. 프래그먼트 쉐이더의 출력을 유지할만큼 충분한 버퍼 공간을 유지하는 한, 프래그먼트 쉐이더의 결과가 누적 될 수 있고 프레임 버퍼 블렌드와 쓰기가 순서대로 발생하도록 할 수 있습니다. 블렌딩 단계가 끝날 때까지 표시되지 않습니다.

프래그먼트 셰이더가 프레임 버퍼를 읽는 방법이 있다면, 이러한 읽기가 순서대로 이루어 지도록 일종의 동기화가 필요하므로 작업 속도가 크게 느려집니다.

3

아니요. 언급했듯이 텍스처를 렌더링하는 것이 이러한 기능을 구현하는 방법입니다.

GPU 파이프 라인의 블록 다이어그램을 보면 블렌드 스테이지 (프래그먼트 셰이더 출력과 프레임 버퍼를 결합한 것)가 프래그먼트 셰이더와 별개이며 고정 함수임을 알 수 있습니다.

저는 GPU 디자이너가 아닙니다. 그래서 나는 그 이유를 추측 할 수 있습니다. 아마도 프레임 버퍼 액세스를 빠르게 유지하고 더 나은 병렬 처리가 가능하도록 프레임 쉐이더 스테이지에서 단편 쉐이더 스테이지를 단절하는 것입니다. 멀티 샘플링과 관련한 문제도있을 수 있습니다.

(즉 고정 기능의 혼합은 대부분의 경우에 "충분"입니다 언급 할 필요가 없을 것입니다.)

앤드류 노트로
1

실제로 이것이 이제 Direct3D 11 SM 5.0에서 가능하다고 생각합니다. (필자는 테스트하지 않았습니다.)

OMSetRenderTargetsAndUnorderedAccessViews 메서드를 사용하여 UAV를 PS 5.0에 바인딩하여 읽기 및 쓰기 작업을 허용 할 수 있습니다.

그런 경우 렌더하는 스왑 체인의 백 버퍼는 플래그 DXGI_USAGE_UNORDERED_ACCESS (추측 하건데)으로 만들어야합니다.

DXSDK OIT11 샘플에서 사용됩니다.

0

렌더 타겟보기를 사용하여 텍스처 TEX에 그릴 수 있고 그 텍스트를 다른 셰이더에 입력으로 바인딩 할 수 있습니다 (셰이더 리소스보기 사용). TEX은 pseduo 프레임 버퍼입니다.

1

Shader_framebuffer_fetch 확장을 사용하여 프래그먼트 셰이더에서 프레임 버퍼의 내용을 다시 읽을 수 있습니다. 성능 저하로 GPU에 지원 기능을 추가 할 수 있습니다. 사실, 요즘 소비자 전자 제품 시장에서 잘 알려진 GPU 브랜드의 OpenGL ES2.0 드라이버에이 확장 기능을 추가하기 위해 노력하고 있습니다.