#0 

23-05-2008 12:54:32

Ikam
Membre
Date d'inscription: 16-05-2007
Messages: 56
Site web

Bonjour

J'essaie de faire un shader pour texturer un terrain avec un melange de plusieurs textures.

J'utilise 3 textures + 1 texture rgb qui definie où peindre les autres textures.

Ca marche bien mais je suis limité à ces 4 textures du fait qu'irrlicht à fixé une limite de 4 textures par material (MATERIAL_MAX_TEXTURES = 4) et qui est sans doute une limite fiable au vu de la compatibilité entres differentes cartes graphique.

J'aimerai savoir si il existe une technique pour contourner cette limite sans modifier la constante MATERIAL_MAX_TEXTURES comme par exemple au niveau du shader ou utiliser une autre methode que le melange RGB.

Merci

Hors ligne


#1 

28-05-2008 15:47:42

Ikam
Membre
Date d'inscription: 16-05-2007
Messages: 56
Site web

Comme quoi la reflexion solitaire est salutaire : j'ai trouvé comment faire smile

J'essaie de coder ca et je vous explique, si ca vous interresse bien sur :p

Hors ligne


#2 

29-05-2008 06:34:51

nikska
Membre
Lieu: Montpellier
Date d'inscription: 12-05-2008
Messages: 36

Je ne me suis pas encore penché sur le problème des matériaux à plusieurs textures mais ca m'intéresse.

Hors ligne


#3 

02-06-2008 17:25:37

Ikam
Membre
Date d'inscription: 16-05-2007
Messages: 56
Site web

Yop

Voila j'ai pas mal avancé mais j'arrive sur un point bloquant pour mon petit niveau en matière de programmation de shader.

voila ce que ca donne pour l'instant :


qui contient 7 textures differentes + 1 texture lightmap

Je vous explique la méthode que j'utilise :

Pour passer la limite d'irrlicht des 4 textures par material, j'ai combiné toutes mes textures en une seule grande. Par exemple dans une texture de 2048x2048 je peut mettre 16 texture de 512x512. ce qui représente une sorte de grande texture mosaique.

Ensuite pour pouvoir peindre ses différentes textures aux endroits voulu, j'utilise une texture spéciale avec les 3 couleurs RGB où chaque canal R, G ou B représentera une texture. Donc 1 texture RGB pour 3 textures.

Ma texture mosaïque est donc representée comme un tableau de texture a 2 dimensions avec la structure suivante :

map1 RGB | Texture1 | Texture2 | Texture3
map2 RGB | Texture3 | Texture4 | Texture5
...

La texture1 sera associée au canal R de la map1 RGB
La texture2 sera associée au canal G de la map1 RGB
..
La texture3 sera associée au canal R de la map2 RGB
..

exemple :



Pour l'instant j'utilise que les 8 premiers slots de 512x512 dans cette mosaique.


Le shader prends en entrée 3 images

- la 1ere represente une texture de base qui sera mappé sur toute la surface du terrain
- la 2eme contient les sous-texture et les map RGB (la mosaique)
- la 3eme une lightmap appliquer sur le terrain entier.

Bon pour l'instant le code du shader n'est pas tres generique et ne prends que 8 sous-texture de la mosaique, donc 2 map RGB et 6 textures associées, mais on peut l'etendre autant qu'on veux, le principe reste le meme.


Le probleme que je rencontre est pour le niveau de details des sous-textures.

Avec une texture classique (1 seule par texture) dans le shader on fait generalement :

float4 outputcolor = tex2D(image[2], Input.TexCoord0 * LOD);

LOD etant le niveau de detail et plus on l'augmente plus l'image est repeté sur la surface, donnant un effet de rendu plus precis. En fait on étend les coordonnées de la texture et celle-ci se repete car elle est unique

Seulement dans mon shader comme je recupere une texture depuis la mosaique, si j'utilise la methode precedente, on va etendre les coordonnées sur les textures voisines ce qui au final affichera aussi les autres textures et pas seulement la texture voulu.

Il faudrait je pense que se repete la meme texture dans les dimensions de coordonnées étendu par le coeff de LOD. Mais je bloque un peu sur la facon de le coder j'ai essayé plein de truc sans succes.

Quelqu'un pourrait il m'eclairer ?


Je laisse les sources. ICI

Pour l'instant c'est que sous directx et codé en HLSL, mais on peut facilement faire la conversion en GLSL

Merci

Dernière modification par Ikam (02-06-2008 17:27:22)

Hors ligne


#4 

21-06-2010 20:40:05

jeromegz
Petit nouveau
Date d'inscription: 21-06-2010
Messages: 1

Bonjour, alors, déjà , désolé de déterrer un post aussi vieux mais , cela m'intéresse et après avoir téléchargé , la première chose qui apparait est ce : TexCoord0 qui est unique alors que pour un niveau de détail, il faudrait une autre coordonnées , cela est uniquement, faisable avec irrb sous irrlicht et blender (ou creer en interne comme ici).Seulement, même si vous mettez un niveau de détail , c'est votre shader le niveau de détail , il faudrait juste mettre une carte de texture sur le terrain et utiliser ce shader pour les niveaux de détails.en tout cas, c'est sympa à vous; je pense l'utiliser dans l'avenir.

encore merci et si vous voulez du niveau de détail , utilisez une autre "TexCoord1 " et pour un mesh normal, avec 2 textures dans blender et export avec irrb.

sinon, j'espère que il y a encore quelqu'un.
merci encore

Dernière modification par jeromegz (21-06-2010 20:52:02)

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
25 invités en ligne
Aucun membre connecté
RSS Feed