Pregunta

Actualmente estoy tratando de dibujar sombras sobre una escena en Direct3D 9. Estoy tratando de hacer una representación de pases múltiples y tengo problemas para comprender cómo usar/establecer el modo de mezcla.

He realizado un pase de profundidad que llena el búfer de profundidad y luego tengo un bucle que boques a través de todas las luces de la escena. Dentro de ese bucle tengo 2 bucles que atraviesan todas las formas en la escena

Tengo este tipo de configuración

for(number of shapes)
{
  //render from camera position and fill depth buffer
}
for(number of lights)
{
  for(number of shapes)
  {
    //render to shadow map
  }
  for(number of shapes)
  {
    //render to screen
  }
}

En las pix puedo ver que brota a través de cada luz, pero cuando la ejecuto solo se muestra la última luz en la matriz de luz. Creo que tiene algo que ver con el modo de mezcla.

He investigado el modo de mezcla y he encontrado información sobre la mezcla de origen y destino. ¿Es esto lo que necesito/alguien podría ayudarlo a explicarlo por favor?

Gracias por adelantado,

Marca

[EDITAR] Tengo ambas luces visibles usando el siguiente código

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

Las sombras no se ven correctas, pero me estoy acercando al resultado deseado.

Cualquier consejo sería genial

Gracias,

Marca

¿Fue útil?

Solución

También creo que tienes un conjunto de estados de mezcla alfa. Supongo que haces una mezcla SRC y reemplazas tu imagen anterior por la nueva y no haces ninguna mezcla alfa. Necesitas pensar en lo que quieres. Supongo que quieres una mezcla src_over.
los Porter Duff Las reglas pueden darle una pista y son muy fáciles de implementar en DirectX. Para una mirada de ejemplo aquí.
Editar Debería leer con más cuidado.

La mezcla alfa y los sombreadores de píxeles son independientes. Por lo tanto, puede usar el sombreador Pixel para cambiar el valor de color de su fuente. Tal vez para agregar algún efecto especial o lo que quieras probar. Pero tan pronto como desee combinar su fuente sobre un destino y no desea reemplazar todos los píxeles con otros nuevos, debe habilitar la mezcla alfa. Por ejemplo, como este

hr = device->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
hr = device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
hr = device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

Este código multiplicará todos los píxeles de origen con su valor alfa y todos los píxeles de destino con 1-Source_alpha. Y combínelos con el nuevo destino.

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