Search code examples
openglglslopengl-4

Type mismatch vertex attribute


I write glsl wrapper for education purposes, but I stopped because I have some misunderstanding. When I want insert variable to specific location, I have mismatch warning. Because location is GLint, but glVertexAttrib location must be GLuint.

Here's my code sample

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

Solution

  • glGetAttribLocation() may return negative indices in case of an error. Of course, a negative index is not valid if used for glVertexAttrib...(). That's why there is a type mismatch. You can resolve this with a simple cast:

    GLint retrievedLocation = glGetAttribLocation(program,variable);
    if(retrievedLocation < 0)
        return ...; //there is no variable with this name
    GLuint location = (GLuint) retrievedLocation;