【问题标题】:Formal parameter with __declspec(align('16')) won't be aligned带有 __declspec(align('16')) 的形式参数不会对齐
【发布时间】:2015-02-12 22:22:01
【问题描述】:

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

错误 2 错误 C2719: 'value': 形参 __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。

【问题讨论】:

  • const std::string &name, const glm::mat4 &value.
  • GLM 需要 16 字节对齐才能使其 SIMD 优化工作,因此它会告诉编译器这就是问题所在。另一方面,GL 根本不关心value 是否在 16 字节边界上对齐。无论如何,你应该通过引用传递这些,没有理由复制一个矩阵发送到 OpenGL。

标签: c++ opengl glm-math


【解决方案1】:

来自Microsoft's documentation 关于该错误:

align __declspec 修饰符不允许用于函数参数。

不要将参数复制到未对齐的位置。传递对现有已对齐数据的常量引用。

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

【讨论】:

    【解决方案2】:

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

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

    我以前用过这个技巧来强制对齐数据。您还可以在alignedMat 中执行memcpy 以有时强制对齐事物。不要认为这是正确的做法。您应该创建具有正确对齐的元素。它只是为了查看有什么不符合、测试和调试的地方。

    另外,如果您在方法定义中的参数上使用 __declspec 修饰符。不要。

    【讨论】:

    • 实际上是调用此函数时复制的问题。 glUniformMatrix4fv (...) 不需要 16 字节对齐的地址,但 glm::mat4 的实例化需要。你可以看到这个问题来自here__m128 内在函数隐含地是__declspec(align(16))。理论上,此限制仅适用于针对 x86 进行编译时 - x64 始终将堆栈顶部对齐在 16 字节边界上。
    【解决方案3】:

    通过引用传递您的参数(这里是一个名为“颜色”的 3D 矢量),以消除对齐错误:

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

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 2013-11-26
      • 2013-06-26
      • 2019-05-04
      • 2013-08-12
      • 2017-09-29
      • 2012-12-21
      • 2013-11-24
      相关资源
      最近更新 更多