it-swarm.com.de

Formale Parameter mit __declspec (align ('16 ')) werden nicht ausgerichtet

Ich versuche, eine Funktion zum Setzen von Shader-Uniformen zu erstellen, aber wenn ich versuche, es zu kompilieren, erhalte ich diesen Fehler:

Fehler 2 Fehler C2719: 'value': Formalparameter mit __Declspec (align ('16 ')) wird nicht ausgerichtet

Hier ist der Funktionscode:

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);
}

Ich benutze Visual Studio 2013.

15
Jozef Culen

Aus Microsofts Dokumentation zu diesem Fehler:

Der Modifizierer align __declspec ist für Funktionsparameter nicht zulässig.

Nicht copy der Parameter an einen nicht ausgerichteten Ort. Übergeben Sie einen konstanten Verweis auf die vorhandenen, ausgerichteten Daten.

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

Ich bin nicht sicher über die Implementierung von glm :: mat4, aber es ist nicht so eingerichtet, dass die darin enthaltenen Daten an einem vollständigen 'Word'-Speicherort im Speicher abgelegt werden, oder sie wurden an einem falsch ausgerichteten Speicherort erstellt (Sie lesen aus Eine Datei? Irgendwo Zeigerarithmetik-Tricks ausführen?)

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

Wenn Sie möchten, dass ein Hack "funktioniert", können Sie Folgendes versuchen:

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);
}

Ich habe diesen Trick benutzt, um vorher Daten auszurichten. Sie können auch ein Memcpy in alignMat durchführen, um das Ausrichten von Objekten zu erzwingen. NICHT ANNEHMEN, dass dies der richtige Weg ist. Sie sollten Elemente mit der richtigen Ausrichtung erstellen. Es ist lediglich zu sehen, was nicht ausgerichtet ist, getestet und debuggt wird.

Auch wenn Sie den Modifizierer __declspec für den Parameter in der Methodendefinition verwenden. Nicht.

0
Diniden