Historique des modifications - Message

Message #4157

Sujet: splatting shader


Type Date Auteur Contenu
Dernière modification 02-06-2008 15:27:22 Ikam
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
Création du message 02-06-2008 15:25:37 Ikam
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

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
144 invités en ligne
membre en ligne: -
RSS Feed