¿Establecer una textura en un sombreado de píxeles y convertirlo en el objetivo de renderizado?

StackOverflow https://stackoverflow.com/questions/1620096

Pregunta

Me preguntaba, si renderizo una escena con un sombreado al que le pase una textura que también es el objetivo de renderizado de esa escena, ¿causará algún comportamiento no deseado?

Básicamente:

texture t;

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

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

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

device->EndScene();

¿Qué causará esto exactamente?

Si no borro el objetivo de renderizado antes de renderizar, ¿la textura seguirá funcionando igual? Simplemente asumo que los cambios finales no se escriben en la textura hasta que se llame a dispositivo- > ¿Fin?

¿Fue útil?

Solución

Supongo que estás hablando de DirectX9. La documentación no dice nada sobre este caso específico, pero puedo decirle lo siguiente:

  

Supongo que los cambios finales no se escriben en la textura hasta que se llame a dispositivo- > Fin

Esta es una suposición errónea. Piénselo, está asumiendo que todos los píxeles de todos los triángulos que dibuje se almacenarán 'en algún lugar' y que todas las recuperaciones de texturas se ejecutarán sin que se vuelva a escribir ningún píxel en el objetivo de procesamiento. Esto requiere una cantidad arbitraria de memoria y, por lo tanto, no es posible.

En la práctica:

  • el hardware generalmente procesa los triángulos como vienen, muchos a la vez
  • actualiza el búfer de cuadros (que en su caso es el respaldo de la memoria de textura) cuando lo desea, asumiendo que no puede haber condiciones de carrera

Entonces, asumiendo que DX9 no se queja (pruébalo si realmente quieres saberlo, ya no hago DX9), estará indefinido.

Dicho esto, DirectX10 está siendo más explícito al respecto ( fuente ):

  

Si alguno de los sub-recursos también están actualmente   obligado a leer o escribir (tal vez   en una parte diferente de la tubería),   esos puntos de enlace se anularán   para evitar que el mismo sub-recurso   siendo leído y escrito simultáneamente   en una sola operación de renderizado.

Por lo tanto, en DirectX10, su configuración de textura será eliminada por la API.

Otros consejos

Aunque no puedo señalar detalles, estoy bastante seguro de que es un comportamiento indefinido. El método que usa una tarjeta gráfica para sombrear fragmentos puede variar (hacer diferentes cantidades a la vez, etc.), pero en cualquier caso práctico, hace más de un fragmento a la vez. Esto significa que estará leyendo y escribiendo en los mismos lugares, lo que provocará condiciones de carrera. No creo que sea recomendado.

El tiempo de ejecución de depuración evitará que hagas esto y te proporcionará una advertencia. El tiempo de ejecución de lanzamiento " podría " (pero probablemente no) funcione.

El problema viene del hecho de que hay bastante retraso entre la carga del píxel desde una textura y su uso. Esto se soluciona cargando un bloque de texels en un caché. Las escrituras se almacenan en búfer y se escriben directamente en la memoria. Por lo tanto, es probable que termine con un problema que puede estar leyendo un texel que ya se haya actualizado, pero el caché estará desactualizado. Si SÓLO está leyendo el texto que se está escribiendo en él " puede " funciona, pero de manera realista, dichos detalles de implementación se dejan a los IHV. No están obligados a permitir que esto funcione.

Como han dicho otros ... es un comportamiento muy indefinido.

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