픽셀 셰이더에서 텍스처를 설정하고 렌더링 대상으로 만들었습니까?

StackOverflow https://stackoverflow.com/questions/1620096

문제

나는 그 장면의 렌더링 대상이되는 질감으로 전달되는 셰이더를 사용하여 장면을 렌더링한다면 원치 않는 행동을 일으킬 것인가?

그래서 기본적으로:

texture t;

shader->SetTexture("texture",t);

device->SetRenderTarget( 0, t->surface );

shader->Begin("effect")
// do some more shader stuff

device->EndScene();

이로 인해 정확히 원인은 무엇입니까?

렌더링 전에 렌더 대상을 지우지 않으면 텍스처가 여전히 동일하게 작동합니까? 장치-> 끝이 호출 될 때까지 최종 변경이 텍스처에 기록되지 않는다고 가정합니다.

도움이 되었습니까?

해결책

DirectX9에 대해 이야기하고 있다고 가정합니다. 문서는이 특정 사례에 대해 아무 말도하지 않지만 다음을 알려 드릴 수 있습니다.

나는 단지 최종 변경이 장치-> 끝이 불릴 때까지 질감에 기록되지 않는다고 가정합니다

이것은 잘못된 가정입니다. 생각하면, 당신은 당신이 그리는 모든 삼각형의 모든 픽셀이 '어딘가에'저장 될 것이라고 가정하고 모든 텍스처를 렌더링 대상으로 다시 쓰지 않고 실행 된 모든 텍스처 페치가 실행되었습니다. 이를 위해서는 임의의 양의 메모리가 필요하므로 불가능합니다.

실제로:

  • 하드웨어는 일반적으로 삼각형이 올 때, 많은 사람들이 한 번에 많은 것을 처리합니다.
  • 레이스 조건이 없다고 가정 할 때 원하는 경우 프레임 버퍼 (경우 텍스처 메모리 백업)를 업데이트합니다.

따라서 DX9가 불평하지 않는다고 가정하면 (정말로 알고 싶다면 시도해보십시오. 더 이상 DX9를하지 않습니다), It ~ 할 것이다 정의되지 않습니다.

즉, DirectX10은 그것에 대해 더 명백하고 있습니다 (원천):

하위 사원이 현재 읽기 또는 쓰기 (아마도 파이프 라인의 다른 부분에 있음)에도 한 바인드 포인트가 단일 렌더링 작업에서 동일한 하위 소스가 동시에 읽히는 것을 방지하기 위해 무효화됩니다.

따라서 DirectX10에서는 API에 의해 텍스처 설정이 제거됩니다.

다른 팁

구체적인 내용을 지적 할 수는 없지만 정의되지 않은 행동이라고 확신합니다. 그래픽 카드가 음영 처리 조각에 사용하는 방법은 다양 할 수 있지만 (한 번에 다른 금액을 수행하는 등) 실제 경우에는 한 번에 하나 이상의 조각이 수행됩니다. 이것은 당신이 같은 위치를 읽고 쓰면 인종 조건을 유발한다는 것을 의미합니다. 나는 그것이 권장된다고 생각하지 않습니다.

디버그 런타임은이 작업을 수행하지 않고 경고를 제공합니다. 릴리스 런타임 "은"(그러나 아마도) 작동하지 않습니다.

문제는 텍스처에서 픽셀을로드하는 것과 사용되는 사이에 상당히 지연이 있다는 사실이 형성됩니다. 이것은 텍셀 블록을 캐시에로드하여 고정됩니다. 글은 버퍼링되어 기억으로 똑바로 쓰여집니다. 따라서 이미 업데이트 된 텍셀을 읽을 수있는 문제로 끝날 수 있지만 캐시는 오래되지 않습니다. 당신이 그것에 작성되는 텍셀 만 읽고 있다면, "may"작동하지만 현실적으로 그러한 구현 세부 사항은 IHV에 맡겨집니다. 그들은 이것을 일할 의무가 없습니다.

다른 사람들이 말했듯이 ... 그것은 매우 정의되지 않은 행동입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top