Hello,

Je suis actuellement en train de faire le chapitre 1 (Effective Water Simulation from Physical Models) du livre GPU Gem 1.
J'ai déjà crée mon quad, que j'anime suivant la fonction sinusoïdale (la première équation) directement dans le TES stage.
la voici :

Nom : ch01_eqn001.jpg
Affichages : 59
Taille : 14,0 Ko, avec

  • Wavelength (L): the crest-to-crest distance between waves in world space. Wavelength L relates to frequency w as w = 2p/L.
  • Amplitude (A): the height from the water plane to the wave crest.
  • Speed (S): the distance the crest moves forward per second. It is convenient to express speed as phase-constant phase-constant.jpg , where phase-constant.jpg = S x 2p/L.
  • Direction (D ): the horizontal vector perpendicular to the wave front along which the crest travels.


coordonnées spatiales de mon quad:
Nom : quad.png
Affichages : 71
Taille : 2,6 Ko

Si j'ai bien compris le concept:

- le tesselation control shader permet de définir la subdivision du maillage de mon quad qu'il envoi aussitôt au tesselation engine.
- le tesselation engine crée les multitudes de vertices qui doivent etre creer a cause de la subdivision du maillage. Puis il envoi chaque vertices au tesselation evaluation shader.
- le tesselation evaluation shader permet de definir les nouvelles coordonnees de chaque vertices puis les pushs dans la built-in variable gl_position.

J'ai suivis cette méthode et ai cree les shaders correspondant.

Vertex shader:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
#version 430 core
 
in highp vec4   in_Vertex;
 
void main(void)
{
    gl_Position = in_Vertex;
}
TCS:
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
 
#version 430 core
#define lvl 60
 
layout (vertices = 4) out;
 
void main(void)
{
    if (gl_InvocationID == 0)
    {
            gl_TessLevelOuter[0] = lvl;
            gl_TessLevelOuter[1] = lvl;
            gl_TessLevelOuter[2] = lvl;
            gl_TessLevelOuter[3] = lvl;
            gl_TessLevelInner[0] = lvl;
            gl_TessLevelInner[1] = lvl;
    }
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}
TES:
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
 
#version 430 core
 
layout (quads) in;
layout (location = 1) uniform float t;
 
uniform mat4 uni_Matrix;
 
void main(void)
{
    vec4 p1 = mix(gl_in[0].gl_Position,
                  gl_in[1].gl_Position,
                  gl_TessCoord.x);
    vec4 p2 = mix(gl_in[2].gl_Position,
                  gl_in[3].gl_Position,
                  gl_TessCoord.x);
    vec4 p = mix(p2, p1, gl_TessCoord.y);
 
    float   a = 0.2f;
    float   l = 0.2f;
    float   w = (2.0f * 3.1415926535897932384626433832795028841971693993751058f) / l;
    float   s = 0.1f;
    float   fi = s * w;
    vec2    d = vec2(1.0f, 1.0f);
    p.y -= a * sin(d.y * p.z * w + t * fi);
    //p.x -= a * sin(d.x * p.x * w + t * fi);
 
    gl_Position = uni_Matrix * p;
}
Ce que je ne comprend pas, c'est qu'en changeant la valeur du #define lvl dans mon TCS et qui s'occupe uniquement de la subdivision du maillage, celui ci sabote complètement mon rendu ...
Quand je mets 60, j'obtiens un quad qui monte et qui descend selon le sinus.
Quand je mets 260, j'obtiens bien une vague sinusoïdale.

...

Mes coordonnées spatiales ne devraient pas changer. Donc qu'importe la précision du maillage (qu'elle soit faible ou haute), je devrais normalement obtenir un vague sinusoïdale avec pour fréquence 0.2 ...

Quelqu'un aurait une idée du pourquoi du comment ?