シェーダーのユニフォームを設定するための関数を作成しようとしていますが、コンパイルしようとすると次のエラーが発生します。
エラー2エラーC2719: '値':__declspec(align('16 '))の仮パラメーターは整列されません
これが関数のコードです:
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);
}
Visual Studio 2013を使用しています。
そのエラーについて Microsoftのドキュメント から:
align__ declspec修飾子は、関数パラメーターでは許可されません。
パラメータを位置合わせされていない場所にcopyしないでください。既存の整列されたデータへの定数参照を渡します。
void Shader::setUniform(const std::string &name, const glm::mat4 & value)
// ^^^^^ ^
Glm :: mat4の実装についてはわかりませんが、メモリ内の完全な「Word」の場所にデータを配置するように設定されていないか、位置がずれて作成されました(ファイル?ポインタ演算のトリックをどこかで行う?)
http://virtrev.blogspot.com/2010/09/memory-alignment-theory-and-c-examples.html
ハックで「機能させる」には、次の方法を試してください。
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);
}
以前にこのトリックを使用してデータを強制的に整列させました。また、aligndMatにmemcpyを実行して、時々強制的に整列させることもできます。これが正しい方法だと思い込まないでください。適切な配置で要素を作成する必要があります。これは、調整、テスト、およびデバッグの対象外のものを確認するためだけのものです。
また、メソッド定義のパラメーターで__declspec修飾子を使用している場合。しないでください。