web-dev-qa-db-fra.com

Le paramètre formel avec __declspec (aligner ('16 ')) ne sera pas aligné

J'essaye de faire fonctionner pour mettre des uniformes de shader, mais quand j'essaye de le compiler j'obtiens cette erreur:

Erreur 2 Erreur C2719: 'valeur': paramètre formel avec __declspec (align ('16 ')) ne sera pas aligné

Voici le code de fonction:

void Shader::setUniform(std::string name, const glm::mat4 value){
    GLint uniform = glGetUniformLocation(m_program, name.c_str());
    glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}

J'utilise Visual Studio 2013.

15
Jozef Culen

De documentation de Microsoft sur cette erreur:

Le modificateur align__declspec n'est pas autorisé dans les paramètres de fonction.

Ne pas copier le paramètre dans un emplacement non aligné. Passer une référence constante aux données existantes alignées.

void Shader::setUniform(const std::string &name, const glm::mat4 & value)
//                                               ^^^^^           ^
23
Drew Dormann

Je ne suis pas sûr de l’implémentation de glm :: mat4, mais il n’est pas configuré de telle sorte que les données qu’il contient soient placées dans un emplacement "Word" complet en mémoire ou créées dans un emplacement mal aligné (vous lisez un fichier? Faire des astuces arithmétiques de pointeur quelque part?)

http://virtrev.blogspot.com/2010/09/memory-alignment-theory-and-c-examples.html

Si vous voulez un bidouillage pour "le faire fonctionner", vous pouvez essayer:

void Shader::setUniform(std::string name, const glm::mat4 value){
    // This assumes your copy constructor works correctly
    glm::mat4 alignedMat = value;
    GLint uniform = glGetUniformLocation(m_program, name.c_str());
    glUniformMatrix4fv(uniform, 1, GL_FALSE, (GLfloat*)&value);
}

J'ai déjà utilisé cette astuce pour forcer l'alignement des données auparavant. Vous pouvez également faire un memcpy en alignéMat pour forcer l’alignement des choses par moments. N'assumez pas c'est la bonne façon de le faire. Vous devriez créer des éléments avec un alignement correct. C'est simplement pour voir ce qui n'est pas aligné, pour les tests et le débogage.

Aussi, si vous utilisez le modificateur __declspec sur le paramètre dans la définition de la méthode. Ne pas.

0
Diniden