En passant la coutume de type (struct) uniforme de l'intervalle Qt à GLSL à l'aide de QGLShaderProgram

J'ai défini une structure pour les paramètres de la lumière qui contient deux vecteurs. La structure est définie en C++ et GLSL d'une manière analogue (note: QVector3D encapsule 3 floats, pas doubles):

C++ programme d'accueil:

struct LightParameters {
    QVector3D pos;
    QVector3D intensity;
};

Fragment Shader:

struct LightParameters {
    vec3 pos;
    vec3 intensity;
};

Dans le fragment shader, j'ai aussi de définir les uniformes. Le nombre de feux est limité à 8, de sorte que l'uniforme tableau a une taille constante (mais seulement numLights sont effectivement utilisées):

const int maxLights = 8;
uniform int numLights;
uniform LightParameters lights[maxLights];

Dans le programme d'accueil, j'définir les lumières et les transmettre à l'shader (QGLShaderProgram):

static const int maxLights = 8;
LightParameters lights[maxLights];

int numLights = 1;
lights[0].pos = {0, 1, 0};
lights[0].intensity = {1, 1, 1};

shaderProgram->bind();
shaderProgram->setUniformValue("numLights", numLights);
shaderProgram->setUniformValueArray("lights", reinterpret_cast<GLfloat*>(lights), maxLights, 6);
shaderProgram->release();

La 6 dans le dernier paramètre doit indiquer que chaque élément du tableau utilise 6 GLfloats de la crue float array, aka "tuple de taille".

Selon la documentation de Qt, il ne devrait pas être possible d'utiliser un tuple de taille de 6 (1, 2, 3, 4 sont autorisés). De l'autre côté, QGLShaderProgram permet de passer dans une matrice avec jusqu'à 4x4 entrées. GLSL permet également de structures pour les uniformes qui ont plus de 4 flotteurs (selon cet exemple).

Cela conduit à la question:

Comment puis-je passer des structures de flotteurs /vecteurs comme un uniforme tableau à l'aide de Qt? Si il n'est pas possible à l'aide de Qt, je vais appeler la GL fonction pour faire cela, mais je suis intéressé si Qt peut le faire pour moi commodément.

Bien sûr, j'ai essayé le code ci-dessus, de toute façon. Il en résulte dans tous les vecteurs de la struct être mis à 0.

Quand je baisse la deuxième paramètre dans la structure et l'utilisation d'un n-uplet de la taille de 3, le code ne fonctionne toujours pas! Cependant, quand il vient à l'aide de vec3 dans le shader (encore la structure avec un QVector3D dans le programme d'accueil, d'un tuple de taille = 3), il fonctionne.

Donc le problème semble être que les types personnalisés sont traitées différemment dans l'OpenGL hôte du programme de l'API, mais Qt ne semble pas le supporter. J'utilise actuellement deux uniformes tableaux (un pour le pos, l'un pour l'intensité) comme une solution de contournement.

OriginalL'auteur leemes | 2013-05-24