5

C++ directx 11 SDK를 사용하여 한 번에 두 텍스처로 렌더링하려고합니다. 하나의 텍스처에 결과 이미지의 각 픽셀의 색상 (일반적으로 3D 장면을 렌더링 할 때 화면에 표시되는 색상)과 각 픽셀 및 깊이의 법선을 포함하는 또 다른 텍스처 (보통 3 float 및 1 float 깊이를 위해). 지금 생각해 볼 수있는 것은 두 개의 렌더링 타겟을 만들고 첫 번째 패스를 색상으로 렌더링하고 두 번째 패스는 법선과 깊이를 각각의 렌더링 타겟에 각각 전달하는 것입니다. 그러나 이것은 첫 번째 패스에서 각 픽셀의 색, 일반 및 깊이의 정보를 얻을 수 있으므로 시간 낭비로 보입니다. 어떻게 든 픽셀 쉐이더로 두 텍스처를 출력하는 방법이 있습니까?directx에서 한 패스로 여러 텍스처에 렌더링하기

도움을 주시면 감사하겠습니다.

P. 나는 픽셀 쉐이더에서 RWTexture2D 또는 RWStructuredBuffer 라인을 따라 뭔가를 생각하고있다. 약간의 배경 : 계산 쉐이더에서 추가 처리를 위해 두 이미지가 필요합니다. 어떤 측면에서 동기화의 문제가 생깁니 까? : 픽셀 쉐이더 (계산 쉐이더와 달리)가 한 번에 하나씩 각 픽셀을 씁니다. 픽셀 쉐이더가 완료되면 어떻게 알 수 있고 계산 쉐이더에게 이미지 후 처리를 시작하도록 알릴 수 있습니까?

답변

10

MRT (Multiple Render Targets)를 사용하여 이것을 한 번에 렌더링해야합니다.

그런 다음 한 번에 두 텍스처에 기록하는 방법을 보여줍니다 출력 사용 OMSetRenderTargets

http://msdn.microsoft.com/en-us/library/windows/desktop/ff476464(v=vs.85).aspx

http://hieroglyph3.codeplex.com/ (DefferedRendering)의 예를 거기로 모두 목표를 바인딩 할 수 있습니다.

그냥 기본적 픽셀 쉐이더 출력 대신에 단일 색상의 구조가됩니다

struct PS_OUTPUT 
{ 
    float4 Color: SV_Target0; 
    float4 Normal: SV_Target1; 
}; 

는 또한 DirectX11에 당신이 당신의 정상 버퍼에 깊이를 쓸 필요가 없습니다, 당신은 단지 깊이 버퍼를 사용할 수 있습니다.

Pixel/Compute shader sync의 경우 동일한 장치에서 동시에 픽셀 쉐이더와 계산 쉐이더를 실행할 수 없으므로 그리기 호출이 완료되면 텍스처가 디스패치 용으로 사용할 준비가됩니다 .

+0

감사합니다. 특히 링크를 위해. 그것들이 얼마나 도움이되는지 상상할 수 없습니다. 다시 한번 감사드립니다. 그건 그렇고, "깊이 버퍼"는 픽셀 셰이더의 SV_Depth 값을 의미합니까? (나는이 책을 어딘가에 읽었을 것이라고 생각하지만, 너무 확신하지는 않는다.) +1 그리고 대답을 받아 들였다. – l3utterfly

+0

probs 없음. SV_Depth는 자신의 깊이 값을 쓰고 싶다면 PixelShader raytracers의 깊이 또는 일부 Texture Array 바이올린과 같은 경우에 유용합니다. 내가 의미했던 것은 DepthStencil 리소스가 Shader Resource View로 바인딩 될 수 있기 때문에 씬에 깊이 버퍼를 바인드 할 것이므로 재사용 할 수도 있기 때문에 무료입니다. – catflier

관련 문제