5

Estoy tratando de renderizar dos texturas con una pasada usando C++ directx 11 SDK. Quiero que una textura contenga el color de cada píxel de la imagen resultante (lo que normalmente veo en la pantalla cuando represento una escena 3D) y otra textura que contenga la normal de cada píxel y profundidad (3 flotantes para normal y 1 flotante) para la profundidad). En este momento, lo que puedo pensar es crear dos objetivos de renderizado y renderizar el primer pase como los colores y el segundo pasar las normales y la profundidad de cada objetivo de renderizado, respectivamente. Sin embargo, esto parece una pérdida de tiempo porque puedo obtener la información del color, la normalidad y la profundidad de cada píxel en el primer pase. Entonces, ¿hay alguna forma de generar dos texturas con el sombreador de píxeles?Rendering a texturas múltiples con una pasada en directx 11

Cualquier ayuda sería apreciada.

P.S. Estoy pensando en algo parecido a RWTexture2D o RWStructuredBuffer en el sombreador de píxeles. Un poco de historia: necesitaré las dos imágenes para su posterior procesamiento en el sombreador de cómputo. Lo cual trae a colación una cuestión secundaria de sincronización: dado que el sombreador de píxeles (a diferencia del sombreador de cómputo) escribe cada píxel de a uno por vez, ¿cómo sabría cuándo finalizó el sombreador de píxeles y decirle al sombreador de cómputo que comience el procesamiento posterior de la imagen?

Respuesta

10

Necesita usar MRT (múltiples destinos de renderizado) para procesar esto en una sola pasada.

Puede enlazar ambos objetivos como salida usando OMSetRenderTargets

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

Hay un ejemplo en http://hieroglyph3.codeplex.com/ (DefferedRendering) que a su vez muestra cómo escribir a ambas texturas a la vez.

Básicamente sólo el sombreado de píxeles de salida tendrá una estructura en lugar de un solo color:

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

También en DirectX11 que no debería necesitar escribir profundidad a su memoria intermedia normal, sólo puede utilizar el buffer de profundidad.

Para la sincronización del sombreador Pixel/Compute, no puede ejecutar un sombreador de píxeles y un sombreador de cómputo al mismo tiempo en el mismo dispositivo, por lo que cuando finalicen sus llamadas, las texturas estarán listas para usar en el cálculo del envío .

+0

Gracias. Especialmente para los enlaces. No puede comenzar a imaginar lo útiles que son. Gracias de nuevo. Por cierto, con "buffer de profundidad", ¿te refieres a un valor SV_Depth para el sombreador de píxeles? (Creo que lo leí en alguna parte, pero no estoy muy seguro.) +1 y respuesta aceptada. – l3utterfly

+0

Sin problemas. SV_Depth es que si quieres escribir tu propio valor de profundidad, es útil en algunos casos (profundidad desde los trazadores de rayos PixelShader, o algún toque de Texture Array). Lo que quise decir es que el recurso DepthStencil también puede vincularse como Shader Resource View, por lo que, dado que también vinculará un búfer de profundidad a su escena, también podría reutilizarlo, es gratis) – catflier

Cuestiones relacionadas