Question

Je me demandais si le rendu d'une scène à l'aide d'un shader auquel je passe dans une texture qui s'avère également être la cible du rendu de cette scène entraînera-t-il un comportement indésirable?

Donc en gros:

texture t;

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

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

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

device->EndScene();

qu'est-ce que cela va causer exactement?

Si je n'efface pas la cible de rendu avant le rendu, la texture fonctionnera-t-elle toujours de la même manière? J'assume simplement que les modifications finales ne sont pas écrites dans la texture avant que le nom de périphérique - > End ne soit appelé?

Était-ce utile?

La solution

Je suppose que vous parlez de DirectX9. La documentation ne dit rien sur ce cas particulier, mais je peux vous dire ceci:

  

J'assume simplement que les modifications finales ne sont pas écrites dans la texture tant que périphérique - > Fin n'est pas appelé

Ceci est une hypothèse erronée. Pensez-y, vous supposez que tous les pixels de tous les triangles que vous dessinez seront stockés «quelque part» et que tous vos extractions de texture seront exécutées sans qu'aucun pixel ne soit réécrit dans la cible de rendu. Cela nécessite une quantité de mémoire arbitraire et n'est donc pas possible.

En pratique:

  • le matériel traite habituellement les triangles au fur et à mesure, plusieurs à la fois
  • il met à jour le tampon de trame (dans votre cas, le support de mémoire de texture) quand il le souhaite, en supposant qu'il ne puisse y avoir de situation de concurrence

Donc, en supposant que DX9 ne se plaint pas (essayez-le si vous voulez vraiment savoir, je ne fais plus de DX9), il sera indéfini.

Cela dit, DirectX10 est plus explicite à ce sujet ( source ):

  

Si des sous-ressources sont également actuellement   pour lire ou écrire (peut-être   dans une autre partie du pipeline),   ces points de liaison seront supprimés   pour empêcher la même sous-ressource de   être lu et écrit simultanément   en une seule opération de rendu.

Ainsi, dans DirectX10, votre paramètre de texture sera supprimé par l'API.

Autres conseils

Bien que je ne puisse pas préciser les détails, je suis presque sûr que c'est un comportement indéfini. La méthode utilisée par une carte graphique pour ombrer des fragments peut varier (faire des quantités différentes à la fois, etc.), mais dans tous les cas pratiques, elle effectue plusieurs fragments à la fois. Cela signifie que vous lirez et écriverez aux mêmes endroits, ce qui provoquera des conditions de course. Je ne pense pas que cela soit recommandé.

Le processus de débogage vous en empêche et vous avertit. Le temps d’exécution de la version " pourrait " (mais ne fonctionnera probablement pas).

Le problème vient du fait qu’il ya tout un délai entre le chargement du pixel à partir d’une texture et son utilisation. Ceci est corrigé en chargeant un bloc de texels dans un cache. Les écritures sont mises en mémoire tampon et écrites directement dans la mémoire. Ainsi, vous rencontrerez probablement un problème qui pourrait être la lecture d’un texel qui a peut-être déjà été mis à jour mais le cache sera obsolète. Si vous lisez UNIQUEMENT le texel qui y est écrit, "peut". travail, mais de manière réaliste, ces détails de mise en œuvre sont laissés aux IHV. Ils ne sont nullement obligés de permettre que cela fonctionne.

Comme d'autres l'ont dit ... c'est un comportement très indéfini.

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