Page 1 sur 2

Shader Terrain GLSL

Publié : mar. 05/juin/2012 10:45
par kelebrindae
Bonjour,

En m'amusant avec mon petit éditeur de material/shader, je suis parvenu à fusionner deux shaders GLSL trouvé sur le net: un qui gère le normal mapping, et un qui gère les terrains. :mrgreen: Yes! :mrgreen:

Concrètement, qu'est-ce que ça fait?
=> le shader prend un mesh (représentant un terrain, de préférence) et applique dessus trois types de textures: de l'herbe là où le mesh est plutôt horizontal, de la roche là où il est escarpé, du sable là où il est relativement plat et proche de l'altitude zéro (pour simuler des plages). De plus, les textures sont "blendées" sur les transition entre les zones, pour faire plus joli.
Du coup, on n'a plus à texturer manuellment le mesh: c'est le shader qui le fait automatiquement en fonction de la topologie du terrain.
Mon apport là-dedans à été la conversion pour Ogre du shader terrain (prévu pour WebGL à l'origine), et l'ajout du normal mapping, récupéré d'un autre shader; le résultat tient un peu de la créature de Frankenstein, mais (à ma grande surprise) ça fonctionne.

En fait, ce serait génial pour un mesh généré dynamiquement dans PB, mais comme le normal mapping a besoin des "tangents" du mesh et que PB ne sait pas (ou pas encore?) les générer, j'ai dû me rabattre sur un mesh statique pour l'exemple.

Le material passe plusieurs paramètres au shader, permettant d'ajuster le résultat:
- la répétition des textures (tiling);
- altitudes mini/maxi du terrain;
- proportion de rochers;
- douceur des transitions entre zones.

Il y aurait plein de choses à améliorer, mais je suis tellement content que ça marche que je le poste tout de suite; n'hésitez donc pas à partager vos modifs / améliorations... :wink:
Exemple avec sources fournis ici: http://keleb.free.fr/codecorner/downloa ... Shader.zip (3 Mo)
(n'oubliez pas d'indiquer "OpenGL" comme subsystem)
Image

Re: Shader Terrain GLSL

Publié : mar. 05/juin/2012 11:17
par Cool Dji
:D !
Yes !
Genial !
Superbe !
Grandiose !
Kelebrindae !

Re: Shader Terrain GLSL

Publié : mar. 05/juin/2012 11:55
par Frenchy Pilou
De la terraformation virtuelle en quelque sorte! 8)

Re: Shader Terrain GLSL

Publié : mer. 06/juin/2012 12:53
par blendman
on the floute :D


Ben bravo encore une fois.

Re: Shader Terrain GLSL

Publié : mar. 19/juin/2012 1:50
par beauregard
Les nuages et les étendus d'eau sont bien en mouvement, et je peux déplacer la caméra librement. :)

Mais il y a un petit soucis de rendu (j'ai bien OpenGL dans Bibliothèque sous-système)
Image

Re: Shader Terrain GLSL

Publié : mar. 19/juin/2012 8:29
par Cool Dji
Hello Beauregard !!

J'ai ça aussi sur un de mes ordis à la maison mais pourtant tous les autres exemples PB en 3D tournent sans soucis.
J'ai également OpenGL dans le compilateur...

Re: Shader Terrain GLSL

Publié : mar. 19/juin/2012 10:00
par kelebrindae
Houlà !

Essayez de virer le "WorldShadows(#PB_Shadow_Modulative)" de la ligne 43; il ne sert pas à grand-chose de toutes façons...

Re: Shader Terrain GLSL

Publié : mar. 19/juin/2012 14:29
par beauregard
Bonjour à tous et à toute :)
kelebrindae a écrit :Houlà !

Essayez de virer le "WorldShadows(#PB_Shadow_Modulative)" de la ligne 43; il ne sert pas à grand-chose de toutes façons...
aucun effet, même en désactivant les lignes voisines (41, 42 et 43), ou encore en positionnant une deuxième lumière, rien y fait. J'imagine que les deux codes .fx joue un rôle d'importance?

Re: Shader Terrain GLSL

Publié : mar. 19/juin/2012 17:03
par kelebrindae
beauregard a écrit :J'imagine que les deux codes .fx joue un rôle d'importance?
Oui: le code du shader proprement dit se trouve dedans.
Ceci dit, pour ton erreur, je verrais bien un problème de version d'OpenGL, car j'avais un peu le même résultat avant de calculer les "tangents" du mesh (sans tangents, pas de normal mapping).

Pour le savoir, tu peux peut-être regarder dans ton "ogre.log" les sections suivantes:

Code : Tout sélectionner

10:59:38: *-*-* OGRE Initialising
10:59:38: *-*-* Version 1.7.0 (Cthugha)
mais ça, c'est fourni par PB, donc tu dois bien avoir la version 1.7.0. .
Et surtout :

Code : Tout sélectionner

10:59:39: GLRenderSystem::_createRenderWindow "PureBasic Ogre", 800x500 windowed  miscParams: FSAA=0 displayFrequency=0 externalWindowHandle=198722 vsync=true 
10:59:39: GL_VERSION = 3.2.9756 Compatibility Profile Context
10:59:39: GL_VENDOR = ATI Technologies Inc.
10:59:39: GL_RENDERER = ATI Radeon HD 3400 Series
qui t'indique la version d'OpenGL utilisée (je crois).
Enfin, tu peux regarder vers la fin du log pour trouver des "OGRE_EXCEPTION", qui indiquent en général ce qui ne va pas...

Re: Shader Terrain GLSL

Publié : mar. 19/juin/2012 19:56
par beauregard

Code : Tout sélectionner

19:13:25: GL_VERSION = 3.2.0
19:13:25: GL_VENDOR = NVIDIA Corporation
19:13:25: GL_RENDERER = GeForce 315/PCI/SSE2



et sûrement le problème:

Code : Tout sélectionner

19:13:26: Can't assign material none to SubEntity of E0 because this Material does not exist. Have you forgotten to define it in a .material script?

le fichier complet, et hop:
http://www.mirari.fr/qupg

Re: Shader Terrain GLSL

Publié : mer. 20/juin/2012 8:13
par kelebrindae
beauregard a écrit :19:13:26: Can't assign material none to SubEntity of E0 because this Material does not exist. Have you forgotten to define it in a .material script?
Non, en fait c'est normal: avec Ogre, par défaut, le nom du material est stocké dans le mesh. Mais là, comme je savais que j'allais assigner manuellement le material dans le code PB, je n'en ai défini aucun quand j'ai créé le mesh. Du coup, au chargement, Ogre essaie de lui assigner un material nommé "none" ("aucun"), ne le trouve pas, et demande si c'est un oubli de notre part... Bref: c'est un peu bizarre, mais le bug ne vient pas de là.

En comparant ton Ogre.log avec un des miens, tout ce que j'ai vu c'est qu'à la fin de ton fichier, il y a:

Code : Tout sélectionner

 GLSL link result : 
alors que moi j'ai:

Code : Tout sélectionner

GLSL link result : Fragment shader(s) linked, vertex shader(s) linked.
Mais après, pour savoir d'où ça vient, il faudrait une console de debug OpenGL ou un truc comme ça; autant dire que cela dépasse de loin mes compétences...

Re: Shader Terrain GLSL

Publié : mer. 20/juin/2012 21:04
par beauregard
En enlevant opengl les montagnes sont toutes blanches, comme recouverte de neige, donc mon pc aurait peut être besoin d'une mise à jour de l'opengl ?

Re: Shader Terrain GLSL

Publié : jeu. 21/juin/2012 8:23
par kelebrindae
Non: en enlevant OpenGL, tu utilises DirectX, qui ne peut exécuter le shader, donc le mesh est affiché sans material; c'est pour ça qu'il est blanc.

Pour ce qui est de mettre tes drivers à jour, franchement, je n'en sais rien. Tu as OpenGL v3.2.0 tandis que moi j'ai la v3.2.9756. Est-ce que ça explique le bug? Aucune idée... :?

Re: Shader Terrain GLSL

Publié : jeu. 21/juin/2012 8:30
par Cool Dji
Hello,

De mon coté, je vais mettre à jour OpenGl sur l'ordi où ça bug : on verra bien...

Re: Shader Terrain GLSL

Publié : jeu. 21/juin/2012 10:58
par Le Soldat Inconnu
même souci, c'est tout noir.
Ou est-ce qu'on trouve la version de OpenGL ? (mon pilote graphique est à jour)