Opengl 类型不匹配的顶点属性

Opengl 类型不匹配的顶点属性,opengl,glsl,opengl-4,Opengl,Glsl,Opengl 4,我写glsl包装是为了教育目的,但我停下来了,因为我有一些误解。当我想将变量插入到特定位置时,我有不匹配警告。因为位置是闪烁的,但glVertexAttrib位置必须是GLuint 这是我的代码示例 bool Material::AddAttrib(GLchar *variable, std::vector<GLdouble> values) { GLint location = glGetAttribLocation(program,variable); GLenum error

我写glsl包装是为了教育目的,但我停下来了,因为我有一些误解。当我想将变量插入到特定位置时,我有不匹配警告。因为位置是闪烁的,但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;
}
bool Material::AddAttrib(GLchar*变量,std::向量值){
闪烁位置=GLGetAttriblLocation(程序,变量);
GLenum error=glGetError();
布尔isNor=打印错误(错误);
如果(!isNor)返回isNor;
开关(values.size()){
案例1:
glVertexAttrib1d(位置,在(0)处的值);
打破
案例2:
glVertexAttrib2d(位置,在(0)处的值,在(1)处的值);
打破
案例3:
glVertexAttrib3d(位置,在(0)处的值,在(1)处的值,在(2)处的值);
打破
案例4:
glVertexAttrib4d(位置,在(0)处的值,在(1)处的值,在(2)处的值,在(3)处的值);
打破
违约:
PrintErrorSize();
返回false;
}
error=glGetError();
isNor=打印错误(错误);
返回isNor;
}
glGetAttriblLocation()
在发生错误时可能返回负索引。当然,如果用于
glVertexAttrib…()
,则负索引无效。这就是类型不匹配的原因。您可以通过简单的强制转换来解决此问题:

GLint retrievedLocation = glGetAttribLocation(program,variable);
if(retrievedLocation < 0)
    return ...; //there is no variable with this name
GLuint location = (GLuint) retrievedLocation;
GLint retrievedLocation=GLGetAttriblLocation(程序,变量); 如果(检索位置<0) 返回//没有具有此名称的变量 GLuint位置=(GLuint)retrievedLocation;