새로운 쉐이더 모델에서 대상 프레임 버퍼의 픽셀 값을 다시 읽는 지원이 있는지 궁금합니다. 나는이 기능이 드로잉 파이프 라인의 나중에 (프로그래밍 할 수없는) 단계에서 완료되었다고 생각하며,이 기능이 프로그래머블 파이프 라인에 추가 될 수 있기를 희망했다.쉐이더 프레임 버퍼 리드 백
텍스처 바인딩 된 프레임 버퍼로 그려진 다음이 텍스처를 셰이더로 보낼 수 있다는 것을 알고 있습니다. 동일한 기능을 구현하는보다 우아한 방법을 기대했습니다.
새로운 쉐이더 모델에서 대상 프레임 버퍼의 픽셀 값을 다시 읽는 지원이 있는지 궁금합니다. 나는이 기능이 드로잉 파이프 라인의 나중에 (프로그래밍 할 수없는) 단계에서 완료되었다고 생각하며,이 기능이 프로그래머블 파이프 라인에 추가 될 수 있기를 희망했다.쉐이더 프레임 버퍼 리드 백
텍스처 바인딩 된 프레임 버퍼로 그려진 다음이 텍스처를 셰이더로 보낼 수 있다는 것을 알고 있습니다. 동일한 기능을 구현하는보다 우아한 방법을 기대했습니다.
는 프레임 버퍼 액세스가 논리적으로 프래그먼트 쉐이더에서 별도의 단계이므로에서 프레임 버퍼를 읽고 조각 셰이더는 불가능합니다. Andrew의 질문에 답하는 이유는 성능과 그래픽 파이프 라인의 주문 요구 사항을 조합 한 것입니다. 렌더링 파이프 라인이 정의되는 방식에 따라 프레임 버퍼 혼합 작업은 파이프 라인 시작 부분에있는 삼각형/프리미티브와 동일한 순서로 이루어져야합니다 (MUST). 반면 조각 쉐이더는 어떤 순서로도 발생할 수 있습니다. 따라서 GPU는 별도의 단계를 거침으로써 프리젠 테이션을 사용할 수있을 때 가능한 한 빨리 조각 쉐이더를 자유롭게 실행할 수 있습니다. 프래그먼트 쉐이더의 출력을 유지할만큼 충분한 버퍼 공간을 유지하는 한, 프래그먼트 쉐이더의 결과가 누적 될 수 있고 프레임 버퍼 블렌드와 쓰기가 순서대로 발생하도록 할 수 있습니다. 블렌딩 단계가 끝날 때까지 표시되지 않습니다.
프래그먼트 셰이더가 프레임 버퍼를 읽는 방법이 있다면, 이러한 읽기가 순서대로 이루어 지도록 일종의 동기화가 필요하므로 작업 속도가 크게 느려집니다.
아니요. 언급했듯이 텍스처를 렌더링하는 것이 이러한 기능을 구현하는 방법입니다.
GPU 파이프 라인의 블록 다이어그램을 보면 블렌드 스테이지 (프래그먼트 셰이더 출력과 프레임 버퍼를 결합한 것)가 프래그먼트 셰이더와 별개이며 고정 함수임을 알 수 있습니다.
저는 GPU 디자이너가 아닙니다. 그래서 나는 그 이유를 추측 할 수 있습니다. 아마도 프레임 버퍼 액세스를 빠르게 유지하고 더 나은 병렬 처리가 가능하도록 프레임 쉐이더 스테이지에서 단편 쉐이더 스테이지를 단절하는 것입니다. 멀티 샘플링과 관련한 문제도있을 수 있습니다.
(즉 고정 기능의 혼합은 대부분의 경우에 "충분"입니다 언급 할 필요가 없을 것입니다.) 앤드류 노트로실제로 이것이 이제 Direct3D 11 SM 5.0에서 가능하다고 생각합니다. (필자는 테스트하지 않았습니다.)
OMSetRenderTargetsAndUnorderedAccessViews
메서드를 사용하여 UAV를 PS 5.0에 바인딩하여 읽기 및 쓰기 작업을 허용 할 수 있습니다.
그런 경우 렌더하는 스왑 체인의 백 버퍼는 플래그 DXGI_USAGE_UNORDERED_ACCESS
(추측 하건데)으로 만들어야합니다.
DXSDK OIT11 샘플에서 사용됩니다.
렌더 타겟보기를 사용하여 텍스처 TEX에 그릴 수 있고 그 텍스트를 다른 셰이더에 입력으로 바인딩 할 수 있습니다 (셰이더 리소스보기 사용). TEX은 pseduo 프레임 버퍼입니다.
Shader_framebuffer_fetch 확장을 사용하여 프래그먼트 셰이더에서 프레임 버퍼의 내용을 다시 읽을 수 있습니다. 성능 저하로 GPU에 지원 기능을 추가 할 수 있습니다. 사실, 요즘 소비자 전자 제품 시장에서 잘 알려진 GPU 브랜드의 OpenGL ES2.0 드라이버에이 확장 기능을 추가하기 위해 노력하고 있습니다.