(Re) bonjour...
Voila j'ai une île. Celle-ci est entourée d'eau (sic). Je souhaite modifier la transparence de mon eau en fonction de la profondeur.
Au départ, j'ai (bêtement) pris la profondeur "classique" de l'eau (projection sur l'axe Y). Très bien c'est joli, mais pas réel du tout.
Je veux maintenant prendre la profondeur de l'eau en tenant compte de la position de la caméra. Ainsi je connaitrais réellement la quantité d'eau traversée. Et je vais faire ça à travers un vertex shader (ouahh mon premier VS...). C'est ce qu'il y a de plus facile, non? (sans en avoir l'air, ceci est une vrai question)
Voici le principe de mon shader qui est censé me projeter mes coordonnées sur le plan Y=WaterLevel avec ma caméra comme centre de projection:
_ je pars des vertex de mon terrain
_ je calcule le vecteur Camera->Terrain
_ je calcule k = Camera->Eau.y / Camera->Terrain.y (je connais Eau.y qui est fixe (c'est la hauteur de ma mer))
_ j'en déduis le vecteur Camera->Eau et donc le point Eau
Malheureusement ... ça marche pas....
En mode Retail, mon eau est légèrement au-dessus de mon terrain (mais pas à la bonne hauteur) et les positions ne sont pas bonnes
En mode Debug, mon eau est à la bonne hauteur (Y), mais les positions (X et Z) ne sont pas bonnes...
Sinon aucune erreur en mode Debug dans la console...
Note : je soupçonne fortement le paramètres w de mes vertices d'être la cause de mes soucis, mais j'ai essayé de mettre celui-ci à 1 avant de le multiplier par la matrice World/View/Proj, sans résultat...
voici le code de mon shader:
Si vous trouvez une erreur dans mes calculs, merci.......
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 // INPUT: // v0 = position (3 floats) // c0 - c3 = transposed world/view/proj matrix // c4 = camera position // c5 = water-level in y // version instruction vs_2_0 // declare registers dcl_position v0 //Camera->Water = k * Camera->Terrain // with k = (Water.y - Camera.y) / (Terrain.y - Camera.y) sub r0, v0, c4 //Vector Camera->Terrain rcp r1.x, r0.y // =1/(Terrain.y - Camera.y) mov r1.y, c5.y sub r2.z, r1.y, c4.y // =Water.y - Camera.y mul r3.x, r1.x, r2.z //k mad r2, r0, r3.x, c4 //Eau // transform position into projection space dp4 oPos.x, r2, c0 dp4 oPos.y, r2, c1 dp4 oPos.z, r2, c2 dp4 oPos.w, r2, c3 // transfer terrain position to pixel shader mov oT0, v0
Si vous connaissez une autre méthode pour obtenir ce que je veux , merci aussi.
Si vous avez un exemple, un lien, etc... (même si c'est une tout autre méthode)
[EDIT]: comment ça je ne peux pas mettre "..." dans mon titre...
Partager