답변:
그것은 인 하드웨어 제한. 프래그먼트 셰이더는 프로그래밍 가능한 파이프 라인의 일부이지만, 대상 버퍼와의 최종 색상 혼합은 현재 광범위하게 사용 가능한 / 제품 하드웨어에서 프로그래밍 할 수 없습니다 (블렌드 상태를 통해 구성 가능하지만 임의의 값을 쓸 수는 없음) GPU 내장 블렌드 작업을 대체하는 코드).
이를 위해 하드웨어가 구축되지 않은 이유는 아마도 GPU가 엄청나게 평행하다는 사실과 관련이있을 것입니다. 한 번에 많은 조각을 처리합니다. 이러한 조각 중 일부는 최종적으로 대상 버퍼 내에서 서로 상호 작용할 수 있지만 조각 처리의 비동기 특성으로 인해 조각이 처리되고 최종 색상이 방출 된 후까지 어떻게 처리되는지 알 수 없습니다. 항상 결정 론적으로 일어나는 것은 아닙니다.
최종 프레임에서 픽셀 A가 픽셀 B 뒤에 있다고해서 픽셀 A가 항상 프래그먼트 처리를 완료하고 특히 여러 렌더링 프레임에서 B 전에 대상에 기록된다는 의미는 아닙니다. 따라서 픽셀 B를 처리하는 동안 대상 버퍼에서 읽은 값이 항상 픽셀 A 인 것은 아니며 때로는 명확한 값이됩니다.
따라서 프래그먼트 단계에서 직접 대상 버퍼 읽기를 허용하지 않는 것은 블렌드 스테이지를 완전히 만드는 데있어 실제 기술적 인 제한보다 읽기에서 잠재적으로 결정적이지 않은 결과를 얻음으로써 셰이더 프로그래머가 발을 쏠 수 없도록하는 것과 훨씬 더 관련이 있다고 생각합니다. 프로그래밍 가능. 읽기 작업을 엄격하게 제어하여 (예 : 깊이 테스트) GPU는 읽기 값으로 수행되는 작업이 어떤 의미가 있는지 확인합니다.
즉, 비용 / 혜택이 진행될 수도 있습니다. GPU 파이프 라인을 프로그래밍 가능하게하면 칩 설계가 다소 복잡해지며 다른 기능에 비해 대상 버퍼 읽기 요구 / 요청이 상대적으로 낮습니다.
다음과 같은 이유로 픽셀 셰이더가 색상 및 깊이 버퍼에서 읽을 수 없습니다.
픽셀 A와 B는 하드웨어에서 정확히 같은 순간에 음영 처리 될 수 있지만 B는 궁극적으로 ( "후") 픽셀 A 위에 렌더링됩니다.
하드웨어가 B보다 먼저 A를 가리도록 보장하면 하드웨어의 일부는 아무것도하지 않고 A는 음영 처리되고 하드웨어의 일부는 아무것도하지 않고 B는 음영 처리됩니다.
상상할 수있는 최악의 경우, 음영 처리 한 모든 픽셀이 서로 위에 렌더링되고 수천 개의 GPU 스레드 (하나는 제외하고 모두)가 유휴 상태입니다. 이 스레드는 참을성있게 픽셀 A, B, C를 음영 처리합니다.