OpenGL glGetError 1281 错误值

Posted

技术标签:

【中文标题】OpenGL glGetError 1281 错误值【英文标题】:OpenGL glGetError 1281 bad value 【发布时间】:2014-07-01 10:07:13 【问题描述】:

我正在使用带有顶点和着色器的 OpenGL,我的屏幕上没有显示任何内容,所以我使用 glGetError 进行调试:我的一个名为 color_array_buffer 的缓冲区出现错误 1281(错误值),这是我正在谈论的部分:

    GLenum error =  glGetError();
if(error) 
    cout << error << endl; 
    return ;
 else 
    cout << "no error yet" << endl;

//no error


// Get a handle for our "myTextureSampler" uniform
    GLuint TextureID  = glGetUniformLocation(shaderProgram, "myTextureSampler");
    if(!TextureID)
        cout << "TextureID not found ..." << endl;

// Bind our texture in Texture Unit 0
    glActiveTexture(GL_TEXTURE0);
    sf::Texture::bind(texture);
// Set our "myTextureSampler" sampler to user Texture Unit 0
    glUniform1i(TextureID, 0);
// 2nd attribute buffer : UVs
    GLuint vertexUVID = glGetAttribLocation(shaderProgram, "color");
    if(!vertexUVID)
        cout << "vertexUVID not found ..." << endl;
    glEnableVertexAttribArray(vertexUVID);
    glBindBuffer(GL_ARRAY_BUFFER, color_array_buffer);
    glVertexAttribPointer(vertexUVID, 2, GL_FLOAT, GL_FALSE, 0, 0);

error =  glGetError();
if(error) 
    cout << error << endl; 
    return ;

//error 1281

这是我将缓冲区链接到数组的代码:

    if (textured) 
        texture = new sf::Texture();
    if(!texture->loadFromFile("textures/simple.jpeg"/*,sf::IntRect(0, 0, 128, 128)*/))
        std::cout << "Error loading texture !!" << std::endl;
        glGenBuffers(1, &color_array_buffer);
        glBindBuffer(GL_ARRAY_BUFFER, color_array_buffer);
        glBufferData(GL_ARRAY_BUFFER, uvs.size() * sizeof(glm::vec3), &uvs[0], GL_STATIC_DRAW);
    

还有我的 uvs 值:

uvs[0] : 0.748573-0.750412

uvs[1] : 0.749279-0.501284

uvs[2] : 0.99911-0.501077

紫外线[3]:0.999455-0.75038

紫外线[4]:0.250471-0.500702

紫外线[5]:0.249682-0.749677

uvs[6] : 0.001085-0.75038

紫外线[7]:0.001517-0.499994

uvs[8] : 0.499422-0.500239

uvs[9] : 0.500149-0.750166

uvs[10] : 0.748355-0.99823

紫外线[11]:0.500193-0.998728

紫外线[12]:0.498993-0.250415

紫外线[13]:0.748953-0.25092

我是不是做错了什么,如果有人可以帮助我,那就太好了。

【问题讨论】:

所以我试图缩小错误,问题来自 glEnableVertexAttribArray(vertexUVID);这会触发该错误,但我不明白为什么。 【参考方案1】:

您对glGetAttribLocation() 的检查未能找到该属性不正确:

GLuint vertexUVID = glGetAttribLocation(shaderProgram, "color");
if(!vertexUVID)
    cout << "vertexUVID not found ..." << endl;

glGetAttribLocation() 返回GLint(不是GLuint),如果在程序中找不到具有给定名称的属性,则结果为-1。由于您将值分配给无符号变量,因此它将最终成为可能的最大无符号变量,如果您随后将其传递给glEnableVertexAttribArray(),则该参数无效。

您的代码应如下所示:

GLint vertexUVID = glGetAttribLocation(shaderProgram, "color");
if(vertexUVID < 0)
    cout << "vertexUVID not found ..." << endl;

请注意,0 是一个完全有效的属性位置。

【讨论】:

...并不是说负属性索引一定是错误。它完全可以被编译器优化出来。 @genpfault:我不认为我说这是一个错误。我写了“失败”,因为调用未能找到具有给定名称的属性。啊,好吧,我一开始就说“错误”。现在改写了。 不用担心,只是为未来的读者指出优化警告。 你很紧张,由于代码优化,我的变量没有找到,问题是它没有在片段着色器中使用,但在顶点着色器中,我认为它不会走得那么远,谢谢。 我在像素着色器中注释了一个 in 变量来调试它,突然 glGetAttribLocation 开始为该属性返回 -1。没想到shader编译器会这样,让我大吃一惊。

以上是关于OpenGL glGetError 1281 错误值的主要内容,如果未能解决你的问题,请参考以下文章

调试OpenGL比在每个命令后调用glGetError有更好的方法吗?

OpenGL glAttachShader 1281 错误

OpenGL GL_LINE_STRIP 在 glEnd 后给出错误 1281(无效值)

来自 glGetError() 的 INVALID_ENUM 错误。 glGetError 与 glu、glew、glfw?

glCheckFramebufferStatus 返回 0 并且 glGetError 中没有错误 [关闭]

我的OpenGL学习进阶之旅错误处理