Pregunta

Tengo una aplicación simple en la que necesito permitir que el usuario seleccione un sombreador (.fx HLSL o archivo de ensamblaje, posiblemente con múltiples pasadas, pero solo sombreador de píxeles) y previsualizarlo.

La aplicación se ejecuta, aparece la lista de sombreadores y un botón inicia la ventana de vista previa " " Desde esta ventana de vista previa (que tiene una vista de DirectX), el usuario selecciona una imagen y el sombreador se ejecuta en esa imagen y se muestra. Solo se necesita renderizar un marco (no en tiempo real).

Tengo configurada una combinación de sombreador de vértices / píxeles que toma un quad y lo muestra en la pantalla, texturizado con la imagen elegida. Esto funciona perfectamente Luego necesito ejecutar otro efecto, puramente sombreador de píxeles, en la salida del primer efecto, y mostrar la imagen final (postprocesada) en la pantalla. Esto no funciona en absoluto.

He intentado en los últimos días hacer que funcione, pero sin razón aparente, los bloques de código idénticos utilizados para representar cada efecto solo representan el primero. Puedo agregar el segundo archivo de sombreador como una segunda pasada en el primer archivo de sombreador y funciona perfectamente (aunque derrota por completo mi objetivo de obtener una vista previa de los sombreadores creados por el usuario). Cuando trato de usar un segundo efecto (que carga y compila muy bien), no hace nada. Tomé los resultados del primer sombreador (con GetRenderTargetData) y los coloqué en una textura & Amp; superficie (destTex y destSur), luego establezca esa textura como entrada para la segunda pasada (usando dev - > SetTexture y efecto posterior - > SetTexture (" thisframe " , destTex)).

Todas las llamadas tienen éxito, los efectos se compilan, las texturas se cargan, los quads se dibujan, pero el efecto no es visible. Al principio sospeché que el dispositivo (creado con el procesamiento de software de vértices) estaba causando el problema, pero ese no parece ser el caso (lo intenté con hardware y mixto). Además, el uso de un dispositivo HAL y REF (no es un problema, ya que la aplicación no es en tiempo real de todos modos), ese segundo sombreador no es visible. Todo está escrito en C ++ para Direct3D 9.

¿Fue útil?

Solución

Intente borrar el búfer de plantilla de profundidad cada vez que renderice el quad.

Otros consejos

Primero cree una textura, luego renderice el primer sombreador directamente en esa textura. Finalmente renderice el segundo sombreador con la textura como entrada al Backbuffer.

Debe haber algún tipo de entrada de vértice y procesamiento de vértice (ya sea función fija o sombreador) para que se ejecute el sombreador de píxeles. ¿Está suministrando el sombreador de vértices, y si es así, está seguro de que hace lo que el sombreador de píxeles espera? ¿Cómo es su llamada de sorteo?

Probablemente valga la pena mirar un rastro PIX de su aplicación para ver cuál es el estado del dispositivo al intentar usar el efecto de usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top