5

Sto provando a eseguire il rendering su due trame con un passaggio utilizzando C++ directx 11 SDK. Voglio che una texture contenga il colore di ciascun pixel dell'immagine risultante (ciò che normalmente vedo sullo schermo quando si esegue il rendering di una scena 3D) e un'altra texture per contenere la normale di ogni pixel e profondità (3 float per normale e 1 float per profondità). In questo momento, quello che posso pensare è creare due target di rendering e rendere il primo passaggio come i colori e il secondo passare le normali e la profondità rispettivamente a ciascun target di rendering. Tuttavia, sembra una perdita di tempo perché posso ottenere le informazioni sul colore, sulla normale e sulla profondità di ciascun pixel nel primo passaggio. Quindi c'è un modo per produrre in qualche modo due trame con il pixel shader?Rendering su più trame con un passaggio in directx 11

Qualsiasi aiuto sarebbe apprezzato.

P.S. Sto pensando a qualcosa sulla falsariga di RWTexture2D o RWStructuredBuffer nel pixel shader. Un po 'di background: avrò bisogno delle due immagini per un'ulteriore elaborazione nello shader di elaborazione. Il che fa emergere una questione di sincronizzazione: dato che il pixel shader (a differenza dello shader di calcolo) scrive ogni pixel uno alla volta, come faccio a sapere quando il pixel shader è finito e dire allo shader di elaborazione di avviare la post-elaborazione dell'immagine?

risposta

10

È necessario utilizzare MRT (più destinazioni di rendering) per eseguire il rendering in un unico passaggio.

È possibile associare due obiettivi come uscita utilizzando OMSetRenderTargets

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

C'è un esempio in http://hieroglyph3.codeplex.com/ (DefferedRendering) che poi viene illustrato come scrivere ad entrambe le strutture in una sola volta.

appena fondamentalmente il tuo pixel shader sarà uscita una struttura invece di un unico colore:

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

Anche in DirectX11 non si deve bisogno di scrivere profondità al vostro tampone normale, si può semplicemente utilizzare il buffer di profondità.

Per la sincronizzazione dello shader Pixel/Compute, non è possibile eseguire contemporaneamente un pixel shader e uno shader di elaborazione sullo stesso dispositivo, quindi quando le chiamate di disegno sono terminate, le trame sono pronte per l'uso in elaborazione per la spedizione .

+0

Grazie. Soprattutto per i collegamenti. Non puoi iniziare a immaginare quanto siano utili. Grazie ancora. A proposito, con "depth buffer", intendi un valore di SV_Depth per il pixel shader? (Penso di aver letto da qualche parte, ma non ne sono troppo sicuro.) +1 e risposta accettata. – l3utterfly

+0

Nessun problema. SV_Depth è se vuoi scrivere il tuo valore di profondità, è utile in alcuni casi (profondità dai raytracers di PixelShader o da alcuni archi Texture Array). Quello che intendevo è che la risorsa DepthStencil può essere anche associata come Shader Resource View, quindi dal momento che si associa anche un buffer di profondità alla scena, si potrebbe riutilizzarlo, è gratuito) – catflier