Question

J'essaie actuellement de dessiner des ombres sur une scène de Direct3D 9. J'essaie de faire un rendu multi-passer et d'avoir du mal à comprendre comment utiliser / définir le mode de mélange.

J'ai fait une passe de profondeur qui remplit le tampon de profondeur et j'ai ensuite une boucle qui boucle à travers toutes les lumières de la scène. Dans cette boucle, j'ai 2 boucles qui bouclent à travers toutes les formes de la scène

J'ai ce genre de configuration

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
  }
}

in pix, je peux voir qu'il bouge à travers chaque lumière, mais lorsque je l'exécute, la dernière lumière de la matrice de lumière est affichée. Je pense que c'est quelque chose à voir avec le mode de mélange.

J'ai examiné le mode de mélange et j'ai trouvé des informations sur la source et le mélange de destination. Est-ce ce que j'ai besoin / que quelqu'un pourrait-il aider à l'expliquer s'il vous plaît?

Merci d'avance,

marque

[< édition ] J'ai eu les deux lumières visibles en utilisant le code suivant

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

Les ombres n'ont pas l'air correcte mais je me rapproche du résultat souhaité.

Plus de conseils serait génial,

merci,

marque

Était-ce utile?

La solution

Je pense également que vous avez défini de mauvais états de fusion alpha. Je suppose que vous faites un mélange SRC et que vous remplacez votre ancienne image par la nouvelle et que vous ne faites aucun mélange alpha. Vous devez penser à ce que vous voulez. Je suppose que vous voulez un mélange SRC_OVER.
Les règles de Porter Duff peuvent vous donner un indice et elles sont très faciles à implémenter dans directX. Pour un exemple, regardez ici .
[Modifier] Je devrais lire plus attentivement.

Le mélange alpha et les shaders de pixels sont indépendants. Vous pouvez donc bien sûr utiliser le pixel shader pour modifier la valeur de couleur de votre source. Peut-être pour ajouter un effet spécial ou tout ce que vous voulez essayer. Mais dès que vous souhaitez mélanger votre source sur une destination et que vous ne souhaitez pas remplacer tous les pixels par de nouveaux, vous devez activer la fusion alpha. Par exemple. comme ça

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

Ce code multipliera tous les pixels source par leur valeur alpha et tous les pixels de destination par 1-source_alpha. Et combinez-les à la nouvelle destination.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top