Salut après avoir réussi à maitriser les shader GLSL (vertex et fragment) j'essaye depuis peu d'utiliser les geometry program.
Et j'ai des problèmes rien ne s'affiche. J'ai fais un shader qui ne fait rien juste afficher l'objet en orange pour tester. quand j'enlève le geometry shader tout s'affiche. Quand je le met rien ne s'affiche.
Je ne comprend pas d'ou vient l'erreur

Je précise que j'ai une carte NVidia 8700 gt qui support le geometry shader. J'ai télécharger des exemples qui fonctionnnent

voici les codes:

vertex
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
#version 120
 
void main()
{	
	gl_Position = ftransform();
}
geometry
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
#version 120 
#extension GL_EXT_gpu_shader4 : enable
#extension GL_EXT_geometry_shader4 : enable
 
void main() 
{ 
	for(int i = 0; i < gl_VerticesIn; ++i) 
	{ 
		gl_Position = gl_PositionIn[i]; 
		EmitVertex(); 
	}
	EndPrimitive();
}
fragment
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
#version 120
 
void main()
{
	gl_FragColor = vec4(1.0, 0.5, 0.0, 1.0);  
}
et voici le code chargement et compilation du shader:
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
74
75
76
77
78
79
80
81
82
83
 
    std::string nomVP = VERTEX_SHADER_SOURCE;
    std::string nomFP = FRAGMENT_SHADER_SOURCE;
    std::string nomGP = GEOMETRY_SHADER_SOURCE;
    //nomRessource = nom;
    bool l_bGeometryShader = false;
 
    // Create the program object container.
    GLuint shaderID = glCreateProgram();
    GLuint vertexID = 0;
    GLuint fragmentID = 0;
    GLuint geomertyID = 0;
    programName = shaderID;
 
    char error[4096];
    int result = 0;
 
    // Load the vertex shader.
    std::string shaderCode = LoadShader(nomVP.c_str());
    // si NULL: le fichier n'est pas lu 
    if (shaderCode.size() < 1)
    {
        return false;
    }
 
    vertexID = glCreateShaderObjectARB(GL_VERTEX_SHADER);
    const char * source = shaderCode.c_str();
    glShaderSourceARB(vertexID, 1, (const char**)&source, NULL);
    glCompileShaderARB(vertexID);
    glGetObjectParameterivARB(vertexID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
 
 
    // Load the geomerty shader
    // le geometry shader est facultatif
    shaderCode = LoadShader(nomGP);
    if (shaderCode.size() > 1)
    {
        geomertyID = glCreateShaderObjectARB(GL_GEOMETRY_SHADER_EXT);
        source = shaderCode.c_str();
        glShaderSourceARB(geomertyID, 1, (const char**)&source, NULL);
        glCompileShaderARB(geomertyID);
        glGetObjectParameterivARB(geomertyID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
        l_bGeometryShader = true;
    }
 
    // Load the pixel shader.
    shaderCode = LoadShader(nomFP);
    if (shaderCode.size() < 1)
    {
        return false;
    }
 
        fragmentID = glCreateShaderObjectARB(GL_FRAGMENT_SHADER);
        source = shaderCode.c_str();
        glShaderSourceARB(fragmentID, 1, (const char**)&source, NULL);
        glCompileShaderARB(fragmentID);
        glGetObjectParameterivARB(fragmentID, GL_OBJECT_COMPILE_STATUS_ARB, &result);
 
    if (l_bGeometryShader)
    {        
        ////Setup Geometry Shader////
        //Set POINTS primitives as INPUT
        glProgramParameteriEXT(shaderID,GL_GEOMETRY_INPUT_TYPE_EXT , GL_TRIANGLES );
        //Set TRIANGLE STRIP as OUTPUT
        glProgramParameteriEXT(shaderID,GL_GEOMETRY_OUTPUT_TYPE_EXT , GL_TRIANGLE_STRIP);
        //Set maximum number of vertices to be generated by Geometry Shader 
        //This parameter is very important and have an important impact on Shader performances
        //Its value must be chosen closer as possible to real maximum number of vertices
        glProgramParameteriEXT(shaderID,GL_GEOMETRY_VERTICES_OUT_EXT, 1024);
    }
 
    // attachement
    glAttachObjectARB(shaderID, vertexID);
    if (l_bGeometryShader)
    {        
        glAttachObjectARB(shaderID, geomertyID);
    }
    glAttachObjectARB(shaderID, fragmentID);
 
    // Link them together
    glLinkProgram(shaderID);
    glGetObjectParameterivARB(shaderID, GL_OBJECT_LINK_STATUS_ARB, &result);
    glGetInfoLogARB(shaderID, sizeof(error), NULL, error);