我正在尝试设置着色器制服的功能,但是当我尝试编译它时,我收到此错误:
错误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。
答案 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.