带有__declspec的正式参数(对齐(' 16'))不会被对齐

时间:2015-02-12 22:22:02

标签: c++ opengl glm-math

我正在尝试设置着色器制服的功能,但是当我尝试编译它时,我收到此错误:

  

错误2错误C2719:'值':形式参数with   __declspec(对齐(' 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。

3 个答案:

答案 0 :(得分:23)

来自Microsoft's documentation的错误:

  

功能参数不允许使用align __ declspec 修饰符。

不要参数复制到未对齐的位置。传递对现有对齐数据的恒定引用。

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

答案 1 :(得分:0)

我不确定glm :: mat4的实现,但它没有以一种将数据放在一个完整的单词中的方式设置。内存中的位置或它是在一个未对齐的位置创建的(你从文件中读取?在某处做一些指针算术技巧?)

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

如果你想要一个hack来让它运转起来'你可以尝试:

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

我之前使用过这个技巧强制对齐数据。您还可以对alignedMat执行memcpy以强制对齐事物。不要认为这是正确的方法。您应该创建具有正确对齐的元素。它只是用于查看不对齐,测试和调试的内容。

此外,如果您在方法定义中的参数上使用__declspec修饰符。唐'吨

答案 2 :(得分:-2)

目前正在使用Visual Studio 2013编写Bullet Physics。获取变量的地址,这里是一个名为color的3D矢量,以消除对齐错误:

void SetColor(btVector3 color) { m_color = color; } //does give the error but 

void SetColor(btVector3 &color) { m_color = color; }  //does not.