web-dev-qa-db-ja.com

__declspec(align('16 '))の仮パラメーターは位置合わせされません

シェーダーのユニフォームを設定するための関数を作成しようとしていますが、コンパイルしようとすると次のエラーが発生します。

エラー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を使用しています。

17
Jozef Culen

そのエラーについて Microsoftのドキュメント から:

align__ declspec修飾子は、関数パラメーターでは許可されません。

パラメータを位置合わせされていない場所にcopyしないでください。既存の整列されたデータへの定数参照を渡します。

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

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修飾子を使用している場合。しないでください。

0
Diniden