Shader Terrain GLSL

Généralités sur la programmation 3D
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Shader Terrain GLSL

Message 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
Dernière modification par kelebrindae le mar. 05/juin/2012 11:24, modifié 1 fois.
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Shader Terrain GLSL

Message par Cool Dji »

:D !
Yes !
Genial !
Superbe !
Grandiose !
Kelebrindae !
Only PureBasic makes it possible
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Re: Shader Terrain GLSL

Message par Frenchy Pilou »

De la terraformation virtuelle en quelque sorte! 8)
Est beau ce qui plaît sans concept :)
Speedy Galerie
Avatar de l’utilisateur
blendman
Messages : 2017
Inscription : sam. 19/févr./2011 12:46

Re: Shader Terrain GLSL

Message par blendman »

on the floute :D


Ben bravo encore une fois.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Shader Terrain GLSL

Message 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
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Shader Terrain GLSL

Message 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...
Only PureBasic makes it possible
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Shader Terrain GLSL

Message 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...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Shader Terrain GLSL

Message 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?
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Shader Terrain GLSL

Message 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...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Shader Terrain GLSL

Message 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
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Shader Terrain GLSL

Message 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...
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Re: Shader Terrain GLSL

Message 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 ?
config de mon ordi: seven, directx11, Pentium(R) DualCore E5700, RadeonHD 4550 512MB, PureBasic 4.61 x86
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Re: Shader Terrain GLSL

Message 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... :?
Les idées sont le souvenir de choses qui ne se sont pas encore produites.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Re: Shader Terrain GLSL

Message par Cool Dji »

Hello,

De mon coté, je vais mettre à jour OpenGl sur l'ordi où ça bug : on verra bien...
Only PureBasic makes it possible
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Shader Terrain GLSL

Message 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)
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre