Bonjour,
Suite à cette discussion j'ai appris les rudiments de la programmation des shaders.
Pour résumer, il s'agit de combiner deux textures en une car Irrlicht ne le fait pas tout seul.
Or, j'ai un problème avec la compilation du shader et en particulier avec les coordonnées de la texture de couche 1 (la première texture étant bien sûr en couche 0). Celle-ci n'est pas à l'échelle et, à priori, il ne prend qu'un pixel car elle est uniformément verte. Je me retrouve donc à combiner ma texture 0 avec une couche de vert uniforme...
Autre soucis, lorsque je tente d'utiliser les coordonnées de la couche 0 pour la couche 1, j'ai un message d'erreur:
"error X4515: cannot bind sampler to user specified stage. In ps_1_1, samplers must be bound to the same stage as their TEXCOORD"
Or ce code devrait fonctionne car il fonctionne chez un autre utilisateur.
J'ai essayé avec un cubeSceneNode Irrlicht de base et j'ai le même problème.
Première question d'ordre général: Comment le shader récupère-t-il les textures de la matrice sur laquelle il travaille?
Deuxième question, concernant irrlicht en particulier: Lorsque je crée mon scene node et que je déclare les coordonnées UV de mes vertex, celles-ci sont-elles applicables à toutes les couches de texture? (A priori je ne vois pas pourquoi ce ne serait pas le cas mais bon...)
Je vous remercie par avance de votre intérêt en espérant trouver la solution rapidement.
Hors ligne
S3DVertex contient 1 seule coordonnée de texture, il ne faut donc pas utiliser TexCoord1 dans ton shader. Texcoord0 contient les coordonnées de la texture que contient le S3DVertex courant. Tes 2 textures doivent être de même résolution je pense.
Avoir des textures de tailles différentes n'a aucun intérêt dans ton cas (si tes textures ont la même taille ignores cette dernière phrase ).
Les textures sont récuperées dans le shader grâce à "register(sX)" avec X, l'indice de la texture dans le material irrlicht.
Vu que tu as un post sur le forum anglais, je mets un lien : post parallèle.
Ensuite, il y a un truc qui me chiffonne. Tu dessines ton hexagone bizarrement. Je créérais une variable membre de "CIrrHexagoneSceneNode" qui s'appellerait irr::scene::SMeshBuffer *mBuffer(SMeshBuffer est un typedef de CMeshBuffer<S3DVertex>). L'avantage de SMeshBuffer, c'est que tu peut accéder librement à tout ses membres.
Et ensuite je ferais un truc du genre :
Des modifications sont peut-être à faire car j'ai fait le code de tête. Mais le principe est là, c'est le principal. Ce code utilise les outils mis à disposition par Irrlicht, il est mieux car il te permettra d'activer des fonctionnalités intéressantes comme les VBOs. Enfin, dans le cas où tu mets plusieurs hexagones dans le même buffer.
Edit : petite rectification parce que j'utilise le material du buffer.
Dernière modification par johnplayer (19-10-2012 12:52:20)
Hors ligne
CA Y'EST LA REPONSE EST TOMBEE SUR LE FORUM EN ANGLAIS:
il faut utiliser "video::EPST_PS_2_0"
En tout cas je te renouvelle tous mes remerciements pour ta patience et tes conseils. Quelque chose me dit que je vais rapidement avoir de nouveau besoin d'aide....
Hors ligne
C'est super mais bizarre! Pourquoi ça marche chez avec Shader Model 1 ?!
Sinon regardes quand même le code que je t'ai donné au-dessus, tu auras une meilleure implémentation de ton SceneNode.
Hors ligne
J'y ai déjà jeté un oeil et je pense que je passerai aux buffers dès que j'en aurai l'occasion. J'en ai également profité pour mettre le la création du shader et du material dans la création de l'hexagone.
Sinon, je construis mon hexagone autour du centre en gardant un vertex au centre afin de, plus tard, pouvoir déformer l'hexagone pour, par exemple, suivre un relief...
Hors ligne