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.