类型不匹配的顶点属性
Type mismatch vertex attribute
我写 glsl wrapper 是为了教育目的,但因为我有一些误解而停止了。当我想将变量插入特定位置时,出现不匹配警告。因为位置是GLint,但glVertexAttrib位置必须是GLuint。
这是我的代码示例
bool Material::AddAttrib(GLchar *variable, std::vector<GLdouble> values) {
GLint location = glGetAttribLocation(program,variable);
GLenum error = glGetError();
bool isNor = PrintError(error);
if(!isNor) return isNor;
switch (values.size()) {
case 1:
glVertexAttrib1d(location, values.at(0));
break;
case 2:
glVertexAttrib2d(location, values.at(0), values.at(1));
break;
case 3:
glVertexAttrib3d(location, values.at(0), values.at(1), values.at(2));
break;
case 4:
glVertexAttrib4d(location, values.at(0), values.at(1), values.at(2), values.at(3));
break;
default:
PrintErrorSize();
return false;
}
error = glGetError();
isNor = PrintError(error);
return isNor;
}
glGetAttribLocation()
可能会 return 负索引以防出现错误。当然,如果用于 glVertexAttrib...()
,则负索引无效。这就是类型不匹配的原因。您可以通过简单的强制转换解决此问题:
GLint retrievedLocation = glGetAttribLocation(program,variable);
if(retrievedLocation < 0)
return ...; //there is no variable with this name
GLuint location = (GLuint) retrievedLocation;
我写 glsl wrapper 是为了教育目的,但因为我有一些误解而停止了。当我想将变量插入特定位置时,出现不匹配警告。因为位置是GLint,但glVertexAttrib位置必须是GLuint。
这是我的代码示例
bool Material::AddAttrib(GLchar *variable, std::vector<GLdouble> values) {
GLint location = glGetAttribLocation(program,variable);
GLenum error = glGetError();
bool isNor = PrintError(error);
if(!isNor) return isNor;
switch (values.size()) {
case 1:
glVertexAttrib1d(location, values.at(0));
break;
case 2:
glVertexAttrib2d(location, values.at(0), values.at(1));
break;
case 3:
glVertexAttrib3d(location, values.at(0), values.at(1), values.at(2));
break;
case 4:
glVertexAttrib4d(location, values.at(0), values.at(1), values.at(2), values.at(3));
break;
default:
PrintErrorSize();
return false;
}
error = glGetError();
isNor = PrintError(error);
return isNor;
}
glGetAttribLocation()
可能会 return 负索引以防出现错误。当然,如果用于 glVertexAttrib...()
,则负索引无效。这就是类型不匹配的原因。您可以通过简单的强制转换解决此问题:
GLint retrievedLocation = glGetAttribLocation(program,variable);
if(retrievedLocation < 0)
return ...; //there is no variable with this name
GLuint location = (GLuint) retrievedLocation;