IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

[opengl3] Probleme avec glGetProgramiv et GL_ACTIVE_UNIFORM_BLOCKS


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Par défaut [opengl3] Probleme avec glGetProgramiv et GL_ACTIVE_UNIFORM_BLOCKS
    Bonjours.
    Je suis actuellement en train de faire des tests avec opengl 3 et glsl 1.50 et il y a quelque chose que je ne comprend pas concernant les uniform blocks.

    voici les shaders que j'utilise :

    - vertex shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #version 150
    layout(std140) uniform MyBlock
    {
        vec4 v1;
        vec4 v2;
    };
    uniform vec4 v3;
    in vec4 position;
    void main()
    {
        gl_Position = position;
    }
    - fragment shader :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #version 150
    out vec4 output;
    void main()
    {
        output = vec4(1.0, 1.0, 1.0, 1.0);
    }
    Vous remarquerez que les shaders en eux même n'ont aucun intérêt, mais ce n'est pas très important.
    Je vous passe les détailles de l’implémentation coté opengl, mais les shaders compilent parfaitement et sont correctement linké dans un program du nom de :
    Maintenant, lorsque que je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GLint nbBlocks;
    glGetProgramiv(myProgram, GL_ACTIVE_UNIFORM_BLOCKS, & nbBlocks);
    nbBlocks est égale a 1 et lorque j'utilise les fonctions glGetActiveUniformBlockiv et glGetActiveUniformBlockName j'obtiens bien le nom et les informations de l'uniform block "MyBlock" déclaré dans le vertex shader. Or comme vous pouvez le voir, aucune des données membres de ce block ne sont utilisées ; est ce un comportement normal ? Ne serait il pas censé être non actif car non utilisé ?

    De plus en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    GLint nbUniforms;
    glGetProgramiv(myProgram, GL_ACTIVE_UNIFORMS, & nbUniforms);
    nbUniforms est égal à 2 et en utilisant la fonction glGetActiveUniform, j'obtiens les noms et informations des données membres "v1" et "v2" de "MyBlock", alors que celles ci ne sont pas utilisés. Ne devraient elles pas être inactives également car non utilisées ?
    Vous remarquerez que la variable uniform "v3" elle n'est pas détecté car non utilisé donc inactive.

    A noter que j'ai aussi essayé avec "layout(shared)" et "layout(packed)" et j'ai essayé de compiler en version 4.20 avec "#version 420" mais cela ne change rien.

    Donc ma question est :
    Est ce normal que "MyBlock" ainsi que "v1" et "v2" soient détectés comme actifs alors qu'ils ne sont pas utilisés (comme "v3") ? Et si oui, y a t'il un autre moyen de savoir si ces données sont réellement utilisés dans le program ?
    Merci.

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Pouvons nous avoir une copie du projet (facilement compilable) pour tester sur nos machines ?

    Quelle est votre carte graphique ? (cela peut dépendre du pilote / constructeur).
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Par défaut
    Bonjours,
    Merci de m'avoir répondu. Désolé d'avoir pris tout ce temps pour répondre, mais il m'est impossible de mettre le code de mon projet directement car c'est un très gros projet sur plusieurs dll et mon code est réparti entre toutes ces dll. J'ai donc du fait un programme minimal qui illustre mon problème et ça m'a pris du temps.

    Je travaille sous "Windows 7 edition familiale premium 64 bits"
    Ma carte graphique est une "NVIDIA Geforce GTX 560M" (version du pilote : 8.17.13.142 ; pilote à jour).

    J'utilise code::block pour compiler ce programme en créant un projet c++ vide avec toutes les options par défaut.
    Le programme doit être linké avec opengl (opengl32) et SFML 1.6 (sfml-window-d et sfml-graphics-d pour la version debug ; sfml-window et sfml-graphics pour la version release) que j'utilise pour créer le contexte opengl.
    Il faut aussi le header "glext.h" que j'ai pris sur le site d'opengl.

    voici le contenue de l'unique fichier de ce projet :
    main.cpp :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
     
    #include <iostream>
    #include <SFML/Graphics.hpp>
    #include <GL/glext.h>
    #include <windows.h>
     
    #define glCreateShader(arg1)                                            (* glCreateShaderProc)(arg1)
    #define glShaderSource(arg1, arg2, arg3, arg4)                          (* glCreateSourceProc)(arg1, arg2, arg3, arg4)
    #define glCompileShader(arg1)                                           (* glCompileShaderProc)(arg1)
    #define glGetShaderiv(arg1, arg2, arg3)                                 (* glGetShaderivProc)(arg1, arg2, arg3)
    #define glDeleteShader(arg1)                                            (* glDeleteShaderProc)(arg1)
    #define glCreateProgram()                                               (* glCreateProgramProc)()
    #define glDeleteProgram(arg1)                                           (* glDeleteProgramProc)(arg1)
    #define glAttachShader(arg1, arg2)                                      (* glAttachShaderProc)(arg1, arg2)
    #define glLinkProgram(arg1)                                             (* glLinkProgramProc)(arg1)
    #define glGetProgramiv(arg1, arg2, arg3)                                (* glGetProgramivProc)(arg1, arg2, arg3)
    #define glGetActiveUniformBlockiv(arg1, arg2, arg3, arg4)               (* glGetActiveUniformBlockivProc)(arg1, arg2, arg3, arg4)
    #define glGetActiveUniformBlockName(arg1, arg2, arg3, arg4, arg5)       (* glGetActiveUniformBlockNameProc)(arg1, arg2, arg3, arg4, arg5)
    #define glGetActiveUniform(arg1, arg2, arg3, arg4, arg5, arg6, arg7)    (* glGetActiveUniformProc)(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
     
    int main(void)
    {
        {
        // creation du context opengl
        sf::RenderWindow app;
        app.Create(sf::VideoMode(800, 600, 32), "SFML window");
     
        // recuperation des procedures opengl
        PFNGLCREATESHADERPROC glCreateShaderProc = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
        if (glCreateShaderProc == NULL) {std::cout << "La procedure opengl glCreateShader n'existe pas.\n"; return -1;}
        PFNGLSHADERSOURCEPROC glCreateSourceProc = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
        if (glCreateSourceProc == NULL){std::cout << "La procedure opengl glShaderSource n'existe pas.\n"; return -1;}
        PFNGLCOMPILESHADERPROC glCompileShaderProc = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
        if (glCompileShaderProc == NULL){std::cout << "La procedure opengl glCompileShader n'existe pas.\n"; return -1;}
        PFNGLGETSHADERIVPROC glGetShaderivProc = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
        if (glGetShaderivProc == NULL){std::cout << "La procedure opengl glGetShaderiv n'existe pas.\n"; return -1;}
        PFNGLDELETESHADERPROC glDeleteShaderProc = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
        if (glDeleteShaderProc == NULL){std::cout << "La procedure opengl glDeleteShader n'existe pas.\n"; return -1;}
        PFNGLCREATEPROGRAMPROC glCreateProgramProc = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
        if (glCreateProgramProc == NULL){std::cout << "La procedure opengl glCreateProgram n'existe pas.\n"; return -1;}
        PFNGLDELETEPROGRAMPROC glDeleteProgramProc = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
        if (glDeleteProgramProc == NULL){std::cout << "La procedure opengl glDeleteProgram n'existe pas.\n"; return -1;}
        PFNGLATTACHSHADERPROC glAttachShaderProc = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
        if (glAttachShaderProc == NULL){std::cout << "La procedure opengl glAttachShader n'existe pas.\n"; return -1;}
        PFNGLLINKPROGRAMPROC glLinkProgramProc = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
        if (glLinkProgramProc == NULL){std::cout << "La procedure opengl glLinkProgram n'existe pas.\n"; return -1;}
        PFNGLGETPROGRAMIVPROC glGetProgramivProc = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");
        if (glGetProgramivProc == NULL){std::cout << "La procedure opengl glGetProgramiv n'existe pas.\n"; return -1;}
        PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockivProc = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)wglGetProcAddress("glGetActiveUniformBlockiv");
        if (glGetActiveUniformBlockivProc == NULL){std::cout << "La procedure opengl glGetActiveUniformBlockiv n'existe pas.\n"; return -1;}
        PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockNameProc = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)wglGetProcAddress("glGetActiveUniformBlockName");
        if (glGetActiveUniformBlockNameProc == NULL){std::cout << "La procedure opengl glGetActiveUniformBlockName n'existe pas.\n"; return -1;}
        PFNGLGETACTIVEUNIFORMPROC glGetActiveUniformProc = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform");
        if (glGetActiveUniformProc == NULL){std::cout << "La procedure opengl glGetActiveUniform n'existe pas.\n"; return -1;}
     
        // affichage de la configuration
        std::cout << "VERSION        : " << glGetString(GL_VERSION) << "\n";
        std::cout << "SHADER VERSION : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << "\n";
        std::cout << "VENDOR         : " << glGetString(GL_VENDOR) << "\n";
        std::cout << "RENDERER       : " << glGetString(GL_RENDERER) << "\n";
     
        // creation du vertex shader
        const char * vsSource =
        "#version 150 \n"
        "layout(shared) uniform MyBlock \n"
        "{ \n"
        "   vec4 v1; \n"
        "   vec4 v2; \n"
        "}; \n"
        "in vec4 position; \n"
        "void main() \n"
        "{ \n"
        "    gl_Position = position; \n"
        "} \n";
        GLuint vShad = glCreateShader(GL_VERTEX_SHADER);
        glShaderSource(vShad, 1, & vsSource, NULL);
        glCompileShader(vShad);
        GLint vsCompStat;
        glGetShaderiv(vShad, GL_COMPILE_STATUS, & vsCompStat);
        if (vsCompStat == GL_FALSE){std::cout << "Erreur de compilation dans le vertex shader\n"; return -1;}
     
        // creation du fragment shader
        const char * fsSource =
        "#version 150 \n"
        "out vec4 output; \n"
        "void main() \n"
        "{ \n"
        "    output = vec4(1.0, 1.0, 1.0, 1.0); \n"
        "} \n";
        GLuint fShad = glCreateShader(GL_FRAGMENT_SHADER);
        glShaderSource(fShad, 1, & fsSource, NULL);
        glCompileShader(fShad);
        GLint fsCompStat;
        glGetShaderiv(fShad, GL_COMPILE_STATUS, & fsCompStat);
        if (fsCompStat == GL_FALSE){std::cout << "Erreur de compilation dans le fragment shader\n"; return -1;}
     
        // creation du program
        GLuint myProgram = glCreateProgram();
        glAttachShader(myProgram, vShad);
        glAttachShader(myProgram, fShad);
        glLinkProgram(myProgram);
        GLint linkStat;
        glGetProgramiv(myProgram, GL_LINK_STATUS, & linkStat);
        if (linkStat == GL_FALSE){std::cout << "Erreur de link dans myProgram\n"; return -1;}
     
        // VOICI LE CODE INTERRESSANT
        // recherche des uniform blocks actifs
        GLint nbBlocks;
        glGetProgramiv(myProgram, GL_ACTIVE_UNIFORM_BLOCKS, & nbBlocks);
        std::cout << nbBlocks << " uniform block(s) :\n";
        for (GLint i = 0 ; i < nbBlocks ; ++i)
        {
            GLint lengthName;
            glGetActiveUniformBlockiv(myProgram, i, GL_UNIFORM_BLOCK_NAME_LENGTH, & lengthName);
            GLchar * name = new GLchar[lengthName];
            glGetActiveUniformBlockName(myProgram, i, lengthName, NULL, name);
            std::cout << "\t" << name << "\n";
            delete[] name;
        }
     
        // recherche des uniforms actifs
        GLint nbUniforms;
        glGetProgramiv(myProgram, GL_ACTIVE_UNIFORMS, & nbUniforms);
        std::cout << nbUniforms << " uniform(s) :\n";
        GLint sizeUniformName;
        glGetProgramiv(myProgram, GL_ACTIVE_UNIFORM_MAX_LENGTH, & sizeUniformName);
        GLchar * name = new GLchar[sizeUniformName];
        for (GLint i = 0 ; i < nbUniforms ; ++i)
        {
            GLint size;
            GLenum type;
            glGetActiveUniform(myProgram, i, sizeUniformName, NULL, & size, & type, name);
            std::cout << "\t" << name << "\n";
        }
        delete[] name;
     
        // destruction des donnees opengl
        glDeleteShader(vShad);
        glDeleteShader(fShad);
        glDeleteProgram(myProgram);
     
        // destruction du context opengl
        app.Close();
        }
     
        return 0;
    }
    Voici aussi au cas ou, le même code mais avec un test avec glGetError pour chaque procédures opengl (totalement illisible mais c'est comme ça que j'utilise opengl dans mon gros projet) :
    main.cpp :
    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
     
    #include <iostream>
    #include <SFML/Graphics.hpp>
    #include <GL/glext.h>
    #include <windows.h>
     
    #define glCreateShader(arg1)                                            (* glCreateShaderProc)(arg1)
    #define glShaderSource(arg1, arg2, arg3, arg4)                          (* glCreateSourceProc)(arg1, arg2, arg3, arg4)
    #define glCompileShader(arg1)                                           (* glCompileShaderProc)(arg1)
    #define glGetShaderiv(arg1, arg2, arg3)                                 (* glGetShaderivProc)(arg1, arg2, arg3)
    #define glDeleteShader(arg1)                                            (* glDeleteShaderProc)(arg1)
    #define glCreateProgram()                                               (* glCreateProgramProc)()
    #define glDeleteProgram(arg1)                                           (* glDeleteProgramProc)(arg1)
    #define glAttachShader(arg1, arg2)                                      (* glAttachShaderProc)(arg1, arg2)
    #define glLinkProgram(arg1)                                             (* glLinkProgramProc)(arg1)
    #define glGetProgramiv(arg1, arg2, arg3)                                (* glGetProgramivProc)(arg1, arg2, arg3)
    #define glGetActiveUniformBlockiv(arg1, arg2, arg3, arg4)               (* glGetActiveUniformBlockivProc)(arg1, arg2, arg3, arg4)
    #define glGetActiveUniformBlockName(arg1, arg2, arg3, arg4, arg5)       (* glGetActiveUniformBlockNameProc)(arg1, arg2, arg3, arg4, arg5)
    #define glGetActiveUniform(arg1, arg2, arg3, arg4, arg5, arg6, arg7)    (* glGetActiveUniformProc)(arg1, arg2, arg3, arg4, arg5, arg6, arg7)
     
    int main(void)
    {
        {
        // creation du context opengl
        sf::RenderWindow app;
        app.Create(sf::VideoMode(800, 600, 32), "SFML window");
     
        // recuperation des procedures opengl
        PFNGLCREATESHADERPROC glCreateShaderProc = (PFNGLCREATESHADERPROC)wglGetProcAddress("glCreateShader");
        if (glCreateShaderProc == NULL) {std::cout << "La procedure opengl glCreateShader n'existe pas.\n"; return -1;}
        PFNGLSHADERSOURCEPROC glCreateSourceProc = (PFNGLSHADERSOURCEPROC)wglGetProcAddress("glShaderSource");
        if (glCreateSourceProc == NULL){std::cout << "La procedure opengl glShaderSource n'existe pas.\n"; return -1;}
        PFNGLCOMPILESHADERPROC glCompileShaderProc = (PFNGLCOMPILESHADERPROC)wglGetProcAddress("glCompileShader");
        if (glCompileShaderProc == NULL){std::cout << "La procedure opengl glCompileShader n'existe pas.\n"; return -1;}
        PFNGLGETSHADERIVPROC glGetShaderivProc = (PFNGLGETSHADERIVPROC)wglGetProcAddress("glGetShaderiv");
        if (glGetShaderivProc == NULL){std::cout << "La procedure opengl glGetShaderiv n'existe pas.\n"; return -1;}
        PFNGLDELETESHADERPROC glDeleteShaderProc = (PFNGLDELETESHADERPROC)wglGetProcAddress("glDeleteShader");
        if (glDeleteShaderProc == NULL){std::cout << "La procedure opengl glDeleteShader n'existe pas.\n"; return -1;}
        PFNGLCREATEPROGRAMPROC glCreateProgramProc = (PFNGLCREATEPROGRAMPROC)wglGetProcAddress("glCreateProgram");
        if (glCreateProgramProc == NULL){std::cout << "La procedure opengl glCreateProgram n'existe pas.\n"; return -1;}
        PFNGLDELETEPROGRAMPROC glDeleteProgramProc = (PFNGLDELETEPROGRAMPROC)wglGetProcAddress("glDeleteProgram");
        if (glDeleteProgramProc == NULL){std::cout << "La procedure opengl glDeleteProgram n'existe pas.\n"; return -1;}
        PFNGLATTACHSHADERPROC glAttachShaderProc = (PFNGLATTACHSHADERPROC)wglGetProcAddress("glAttachShader");
        if (glAttachShaderProc == NULL){std::cout << "La procedure opengl glAttachShader n'existe pas.\n"; return -1;}
        PFNGLLINKPROGRAMPROC glLinkProgramProc = (PFNGLLINKPROGRAMPROC)wglGetProcAddress("glLinkProgram");
        if (glLinkProgramProc == NULL){std::cout << "La procedure opengl glLinkProgram n'existe pas.\n"; return -1;}
        PFNGLGETPROGRAMIVPROC glGetProgramivProc = (PFNGLGETPROGRAMIVPROC)wglGetProcAddress("glGetProgramiv");
        if (glGetProgramivProc == NULL){std::cout << "La procedure opengl glGetProgramiv n'existe pas.\n"; return -1;}
        PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockivProc = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)wglGetProcAddress("glGetActiveUniformBlockiv");
        if (glGetActiveUniformBlockivProc == NULL){std::cout << "La procedure opengl glGetActiveUniformBlockiv n'existe pas.\n"; return -1;}
        PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockNameProc = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)wglGetProcAddress("glGetActiveUniformBlockName");
        if (glGetActiveUniformBlockNameProc == NULL){std::cout << "La procedure opengl glGetActiveUniformBlockName n'existe pas.\n"; return -1;}
        PFNGLGETACTIVEUNIFORMPROC glGetActiveUniformProc = (PFNGLGETACTIVEUNIFORMPROC)wglGetProcAddress("glGetActiveUniform");
        if (glGetActiveUniformProc == NULL){std::cout << "La procedure opengl glGetActiveUniform n'existe pas.\n"; return -1;}
     
        // affichage de la configuration
        std::cout << "VERSION        : " << glGetString(GL_VERSION) << "\n";
        std::cout << "SHADER VERSION : " << glGetString(GL_SHADING_LANGUAGE_VERSION) << "\n";
        std::cout << "VENDOR         : " << glGetString(GL_VENDOR) << "\n";
        std::cout << "RENDERER       : " << glGetString(GL_RENDERER) << "\n";
     
        // creation du vertex shader
        const char * vsSource =
        "#version 150 \n"
        "layout(shared) uniform MyBlock \n"
        "{ \n"
        "   vec4 v1; \n"
        "   vec4 v2; \n"
        "}; \n"
        "in vec4 position; \n"
        "void main() \n"
        "{ \n"
        "    gl_Position = position; \n"
        "} \n";
        while (glGetError() != GL_NO_ERROR);
        GLuint vShad = glCreateShader(GL_VERTEX_SHADER);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glCreateShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glShaderSource(vShad, 1, & vsSource, NULL);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glShaderSource (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glCompileShader(vShad);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glCompileShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        GLint vsCompStat;
        while (glGetError() != GL_NO_ERROR);
        glGetShaderiv(vShad, GL_COMPILE_STATUS, & vsCompStat);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetShaderiv (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        if (vsCompStat == GL_FALSE){std::cout << "Erreur de compilation dans le vertex shader\n"; return -1;}
     
        // creation du fragment shader
        const char * fsSource =
        "#version 150 \n"
        "out vec4 output; \n"
        "void main() \n"
        "{ \n"
        "    output = vec4(1.0, 1.0, 1.0, 1.0); \n"
        "} \n";
        while (glGetError() != GL_NO_ERROR);
        GLuint fShad = glCreateShader(GL_FRAGMENT_SHADER);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glCreateShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glShaderSource(fShad, 1, & fsSource, NULL);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glShaderSource (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glCompileShader(fShad);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glCompileShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        GLint fsCompStat;
        while (glGetError() != GL_NO_ERROR);
        glGetShaderiv(fShad, GL_COMPILE_STATUS, & fsCompStat);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetShaderiv (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        if (fsCompStat == GL_FALSE){std::cout << "Erreur de compilation dans le fragment shader\n"; return -1;}
     
        // creation du program
        while (glGetError() != GL_NO_ERROR);
        GLuint myProgram = glCreateProgram();
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glCreateProgram (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glAttachShader(myProgram, vShad);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glAttachShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glAttachShader(myProgram, fShad);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glAttachShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glLinkProgram(myProgram);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glLinkProgram (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        GLint linkStat;
        while (glGetError() != GL_NO_ERROR);
        glGetProgramiv(myProgram, GL_LINK_STATUS, & linkStat);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetProgramiv (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        if (linkStat == GL_FALSE){std::cout << "Erreur de link dans myProgram\n"; return -1;}
     
        // VOICI LE CODE INTERRESSANT
        // recherche des uniform blocks actifs
        GLint nbBlocks;
        while (glGetError() != GL_NO_ERROR);
        glGetProgramiv(myProgram, GL_ACTIVE_UNIFORM_BLOCKS, & nbBlocks);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetProgramiv (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        std::cout << nbBlocks << " uniform block(s) :\n";
        for (GLint i = 0 ; i < nbBlocks ; ++i)
        {
            GLint lengthName;
            while (glGetError() != GL_NO_ERROR);
            glGetActiveUniformBlockiv(myProgram, i, GL_UNIFORM_BLOCK_NAME_LENGTH, & lengthName);
            if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetActiveUniformBlockiv (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
            GLchar * name = new GLchar[lengthName];
            while (glGetError() != GL_NO_ERROR);
            glGetActiveUniformBlockName(myProgram, i, lengthName, NULL, name);
            if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetActiveUniformBlockName (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
            std::cout << "\t" << name << "\n";
            delete[] name;
        }
     
        // recherche des uniforms actifs
        GLint nbUniforms;
        while (glGetError() != GL_NO_ERROR);
        glGetProgramiv(myProgram, GL_ACTIVE_UNIFORMS, & nbUniforms);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetProgramiv (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        std::cout << nbUniforms << " uniform(s) :\n";
        GLint sizeUniformName;
        while (glGetError() != GL_NO_ERROR);
        glGetProgramiv(myProgram, GL_ACTIVE_UNIFORM_MAX_LENGTH, & sizeUniformName);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetProgramiv (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        GLchar * name = new GLchar[sizeUniformName];
        for (GLint i = 0 ; i < nbUniforms ; ++i)
        {
            GLint size;
            GLenum type;
            while (glGetError() != GL_NO_ERROR);
            glGetActiveUniform(myProgram, i, sizeUniformName, NULL, & size, & type, name);
            if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glGetActiveUniform (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
            std::cout << "\t" << name << "\n";
        }
        delete[] name;
     
        // destruction des donnees opengl
        while (glGetError() != GL_NO_ERROR);
        glDeleteShader(vShad);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glDeleteShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glDeleteShader(fShad);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glDeleteShader (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
        while (glGetError() != GL_NO_ERROR);
        glDeleteProgram(myProgram);
        if (glGetError() != GL_NO_ERROR){std::cout << "Erreur dans glDeleteProgram (" << __FILE__ << " : " << __LINE__ << ")\n"; return -1;}
     
        // destruction du context opengl
        app.Close();
        }
     
        return 0;
    }
    Chez moi le programme exécuté m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    VERSION        : 4.2.0
    SHADER VERSION : 4.20 NVIDIA via Cg compiler
    VENDOR         : NVIDIA Corporation
    RENDERER       : GeForce GTX 560M/PCIe/SSE2
    1 uniform block(s) :
            MyBlock
    2 uniform(s) :
            v1
            v2
    Pour revenir au problème initial, je trouve étrange voir anormal et gênant qu'opengl me détecte l'uniform block "MyBlock" comme actif alors que celui ci n'est aucunement utilisé.
    Voila, j'espère avoir été assez précis.
    Merci encore.

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 145
    Billets dans le blog
    150
    Par défaut
    Je n'ai pas trouvé grand chose dans la spécification qui spécifie ce qu'est un uniform actif.
    Active uniform blocks are those
    that contain active uniforms after a program has been compiled and linked.
    et
    A uniform is considered active if it is determined by the compiler
    and linker that the uniform will actually be accessed when the executable code
    is executed. In cases where the compiler and linker cannot make a conclusive
    determination, the uniform will be considered active.
    Du coup, je ne vois pas pourquoi ils compteraient les votre comme actifs
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 12
    Par défaut
    Merci de votre réponse.
    Effectivement, moi aussi je me suis plongé dans les docs et je n'ai rien trouvé de concluant concernant la réel définition d'un uniform actif (et aussi d'un attribut actif).
    Sinon, avez vous essayé mon code pour voir si vous avez un résultat similaire au mien ? (vous n'êtes pas obligé hein ! ).
    En tous cas, dommage, je suis déçut ; j'avais prévu de baser une partie de mon projet sur le principe d'uniforms et d'attributs actif/inactif. Du coup, il va falloir que j'envisage d'autres solutions beaucoup plus pénibles comme une analyse complète de la chaine de characteres du code source ce qui est assez décourageant.
    Si vous avez d'autres solutions je suis preneur...
    Merci.

  6. #6
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 034
    Billets dans le blog
    12
    Par défaut
    Euh ... pour quel type de projet est-il nécessaire de connaître les uniform actifs/inactifs. Quelle application vouliez-vous faire de cette notion ?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

Discussions similaires

  1. Probleme avec la copie des surfaces
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/01/2003, 10h33
  2. Problèmes avec le filtrage des ip
    Par berry dans le forum Réseau
    Réponses: 9
    Dernier message: 30/12/2002, 07h51
  3. probleme avec la touche F10
    Par b.grellee dans le forum Langage
    Réponses: 2
    Dernier message: 15/09/2002, 22h04
  4. Probleme avec fseek
    Par Bjorn dans le forum C
    Réponses: 5
    Dernier message: 04/08/2002, 07h17
  5. [Kylix] probleme avec un imagelist
    Par NicoLinux dans le forum EDI
    Réponses: 4
    Dernier message: 08/06/2002, 23h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo