Probleme Shader hlsl hook directX 9

heyveno Messages postés 2 Statut Membre -  
BoBot Messages postés 6201 Statut Modérateur -

Salut à tous,

Je travaille sur un projet de proxy/hook Direct3D9 pour animer la végétation avec un shader personnalisé. J’ai réussi à identifier la texture d’herbe, à extraire les vertex buffers et à confirmer un format plausible de sommets. Au départ, je pensais que le format était 0x112 (POSITION + COLOR0 + TEXCOORD0). J’ai donc écrit un shader simple qui compile et s’applique correctement. Pourtant, aucune animation n’apparaît, même avec des décalages exagérés.

En testant différents shaders, j’ai découvert quelque chose d’important. Avec le shader basé sur 0x112, rien ne s’affiche. Avec un shader basé sur 0x252 (POSITION + NORMAL + TEXCOORD0), la végétation s’affiche bien, et l’animation fonctionne. Mais dans ce cas, les couleurs sont perdues : tout est rendu en noir ou en gris.

Cela me fait penser que le FVF logué (0x112) est trompeur et ne correspond pas vraiment à ce que le moteur envoie au moment du draw. Le format réel semble bien être du type POSITION + NORMAL + TEXCOORD0, mais dans ce cas je ne récupère pas la couleur/diffuse.

C’est là que je bloque. J’aimerais comprendre pourquoi je n’ai pas de couleur avec ce shader. Est-ce que le moteur passe la couleur par un autre canal ? Est-ce que je dois combiner NORMAL et COLOR dans la déclaration, ou utiliser un registre particulier pour récupérer la valeur diffuse ?

Si quelqu’un a déjà rencontré ce genre de cas ou connaît une méthode fiable pour capter la couleur sur une géométrie initialement prévue pour du pipeline fixe, je serais preneur de vos conseils.

je peux fournir un lien vers le depot github au besoin.

Merci d’avance pour votre aide !

A voir également:

1 réponse

BoBot Messages postés 6201 Statut Modérateur 394
 
Bonjour !
L'IA qui aime les défis est là !
Il se peut que le moteur passe la couleur par un autre canal. Le passage à l'utilisation de NORMAL dans tes shaders indiquerait qu'il y a potentiellement une information de couleur qui est encodée dans la normale de l'objet, c'est une pratique courante pour certains moteurs.

Pour régler ton problème, tu peux essayer de vérifier si ta couleur est passée par un autre canal. Un bon point de départ serait d'examiner le code shader de l'application d'origine pour voir comment ils interpellent la couleur (si c'est possible). En outre, assure-toi que tu interprètes correctement les informations de la normale, car une mauvaise interprétation peut donner l'impression que les couleurs sont perdues.

Si c'est le cas, tu pourrais récupérer l'information de couleur en décodant l'information de la normale. Cette information pourrait être stockée dans le vecteur de la normale elle-même (c'est-à-dire qu'elle utilise un espace de couleurs différent, comme l'espace des couleurs YUV) ou dans un canal séparé - par exemple, le canal alpha.

S'il s'agit d'un pipeline fixe, la couleur pourrait être passée par un registre différent, tu pourrais essayer de vérifier si la couleur est passée par l'un des registres de couleur fixe. Cela nécessiterait probablement que tu modifies ton shader pour prendre en compte ce registre.

Enfin, une autre chose à noter est que certains moteurs peuvent passer les couleurs par le biais d'une texture. Tu pourrais donc aussi vérifier les textures liées au moment du tirage pour voir si l'une d'entre elles contient des informations de couleur.

0