Bonjour,
je suis en train de me mettre aux shaders GLSL et je bloque depuis un moment sur les geometry shaders. La seule référence complète fournissant des exemples de code que j'ai pu trouver est:
Graphic Shaders: Theory And Practise
Je tente donc de faire de la "tesselation" sur une sphère, étant constituée à la base de triangle (ce n'est donc pas une surface de révolution).
J'utilise le geometry shader suivant:
J'ai simplement hardcodé les variables du shader original.
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73 #version 120 #extension GL_EXT_gpu_shader4: enable #extension GL_EXT_geometry_shader4: enable uniform int Level; uniform float Radius; varying float LightIntensity; vec3 V0, V01, V02; void ProduceVertex( float s, float t ) { const vec3 lightPos = vec3( 0., 10., 0. ); vec3 v = V0 + s*V01 + t*V02; v = normalize(v); vec3 n = v; // vec3 tnorm = normalize( gl_NormalMatrix * n ); // the transformed normal vec4 ECposition = gl_ModelViewMatrix * vec4( (1.0*v), 1. ); // LightIntensity = dot( normalize(lightPos - ECposition.xyz), tnorm ); // LightIntensity = abs( LightIntensity ); // LightIntensity *= 1.5; gl_Position = gl_ProjectionMatrix * ECposition; EmitVertex(); } void main() { V01 = ( gl_PositionIn[1] - gl_PositionIn[0] ).xyz; V02 = ( gl_PositionIn[2] - gl_PositionIn[0] ).xyz; V0 = gl_PositionIn[0].xyz; int numLayers = 1 << 2; float dt = 1. / float( numLayers ); float t_top = 1.; for( int it = 0; it < numLayers; it++ ) { float t_bot = t_top - dt; float smax_top = 1. - t_top; float smax_bot = 1. - t_bot; int nums = it + 1; float ds_top = smax_top / float( nums - 1 ); float ds_bot = smax_bot / float( nums ); float s_top = 0.; float s_bot = 0.; for( int is = 0; is < nums; is++ ) { ProduceVertex( s_bot, t_bot ); ProduceVertex( s_top, t_top ); s_top += ds_top; s_bot += ds_bot; } ProduceVertex( s_bot, t_bot ); EndPrimitive(); t_top = t_bot; t_bot -= dt; } }
Cependant, mon soucis est que contrairement à la démo du livre (où il utilise glman pour afficher les shaders), j'ai tenté de l'implémenter dans un de mes codes existant avec caméra vol libre "custom" et ça semble poser problème:
Lorsque je bouge ma caméra, la primitive renvoyée par le shader (TRIANGLE_STIP) bouge en fonction de la position de la caméra et de manière incohérente. Etrangement le reste de la scène (GL_TRIANGLE) non envoyé dans le pipeline modifié avec le geometry shader reste immobile.
Il semblerait donc que je doive bidouiller soit le geometry shader, soit ma camera (argh...) mais je vois pas d'où vient le problème.
J'ai attaché en pièce jointe l'ensemble du projet (requiert CMake + SFML) si qqn est intéressé à y jeter un oeil, dans lequel je ne traite qu'une seule face de la "sphère".
D'avance merci aux motivés ;-)
Partager