2009-10-25 4 views
2

내가 쉐이더를 사용하여 장면을 렌더링하면 그 장면의 렌더 타겟이되는 텍스처에서도 패스하는 경우 궁금한 점이 있습니까? 그래서 기본적으로픽셀 쉐이더에서 텍스처를 설정하고 렌더 타겟으로 만드시겠습니까?

:

texture t; 

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

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

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

device->EndScene(); 

무엇이 원인을 정확히 것인가?

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

답변

3

나는 당신이 DirectX9에 대해 이야기하고 있다고 가정합니다. 문서는이 특정 사건에 대해 아무 말도하지 않지만, 나는 다음 당신에게 말할 수 :

난 그냥 최종 변경 끝

라고합니다> 장치 - 때까지 질감에 기록되지 않는 가정

이것은 잘못된 가정입니다. 생각해 보면, 여러분이 그린 모든 삼각형의 모든 픽셀은 '어딘가에'저장 될 것이고 렌더 타겟에 다시 쓰여지는 픽셀없이 모든 텍스처 가져 오기가 실행된다고 가정하고 있습니다. 이를 위해서는 임의의 양의 메모리가 필요하므로 불가능합니다. 실제로

:

  • 가 여러 번에 와서 하드웨어가 일반적으로 삼각형을 처리 거기 가정이 원할 때 (귀하의 경우 텍스처 메모리 백업이다) 프레임 버퍼를 업데이트
  • 경쟁 조건

수 없습니다 그래서, (당신이 정말로 알고 싶다면 난 더 이상 DX9을하지, 그것을 시도) 불평하지 않습니다 DX9 가정, 그것은 정의되지 않은 것입니다. 다이렉트 그것에 대해 더 명시되는 것을 특징으로

(source) :

모든 자원들은 또한 현재 (파이프 라인의 다른 부분에서 아마도 )를 읽거나 쓰는 행 경우, 그 바인드 포인트는 을 NULL로 처리하여 의 동일한 하위 리소스가 동시에 읽고 쓰여지는 것을 방지합니다. 단일 렌더링 작업에서.

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

3

세부 사항을 지적 할 수는 없지만 정의되지 않은 동작이라고 확신합니다. 그래픽 카드가 쉐이딩 단편에 사용하는 방법은 다양 할 수 있지만 (한 번에 다른 양을 수행하십시오), 실용적인 경우 한 번에 둘 이상의 단편을 수행합니다. 즉, 경쟁 조건을 유발하여 동일한 위치에서 읽고 쓰는 것입니다. 나는 그것이 권장하지 않는다고 생각한다.

2

디버그 런타임은이 작업을 수행하지 못하도록 경고합니다. 릴리스 런타임은 작동 할 수도 있지만 작동하지 않을 수도 있습니다.

문제는 텍스처에서 픽셀을로드 할 때와 사용하는 사이에 꽤 지연이 있다는 사실입니다. 이는 캐시에 텍셀 블록을로드함으로써 해결된다. 쓰기는 버퍼링되고 메모리에 바로 쓰여집니다. 따라서 이미 업데이트 된 텍셀을 읽었을 수도 있지만 캐시가 오래되었을 수있는 문제가 발생할 수 있습니다. 만약 당신이 쓰여지고있는 텍셀만을 읽는다면, "실제로는"작동 할 수도 있지만 현실적으로 그러한 구현 세부 사항은 IHV에 남아 있습니다. 그들은 이것이 작동하도록하는 의무가 없습니다.

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

관련 문제