glDrawArrays在GLESv2上抛出GL_INVALID_VALUE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了glDrawArrays在GLESv2上抛出GL_INVALID_VALUE相关的知识,希望对你有一定的参考价值。

我正在尝试将OpenGL程序移植到GLESv2。该程序使用以下代码将纹理设置为默认的帧缓冲区(如果我将其渲染为也适用于OpenGL的fbo,它也会失败)。

    glBindFramebuffer(GL_FRAMEBUFFER, 0); 
    glVertexAttribPointer(bgra_texcoords, 2, GL_FLOAT, GL_FALSE, 0, display_texcoords);
    glEnableVertexAttribArray(bgra_texcoords);
    DEBUG_ERROR_CHECK();

    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glUseProgram(bgra_program);
    glBindTexture(GL_TEXTURE_2D, inst->texture);
    glUniform1i(bgra_texture, 0); 
    glViewport(inst->x, root_surface->h - (inst->y + inst->h), inst->w, inst->h);
    DEBUG_ERROR_CHECK();

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
    DEBUG_ERROR_CHECK();
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    glFlush();

这适用于OpenGL,但它在GLESv2下的glDrawArrays()上失败。我读到了这个问题:glDrawElements throw GL_INVALID_VALUE​ error与我的问题非常相似,但我无法弄清楚如何将解决方案应用于我的代码,因为我没有使用VertexArray而且我对GL很新。

inst-> texture是使用glTexImage2D()上传的纹理。我在初始化EGL并编译着色器后立即创建了vertex_buffer:

    glGenBuffers(1, &vertex_buffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), 
            vertices, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
    glVertexAttribPointer(bgra_pos, 2, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(bgra_pos);
    DEBUG_ERROR_CHECK();

编辑:您可以在这里查看整个源文件:https://github.com/fernando-rodriguez/mediabox/blob/bc4135d9568b2c5b4e8f39ac63ded2cb66023bcd/src/lib/ui/video-opengl.c。该文件是合成器的视频“驱动程序”,它所做的只是创建2D表面并将它们渲染到屏幕上。如果问题有任何问题或者遗漏了某些内容,请发表评论,以便我可以解决。谢谢。

答案

我想到了。我在eglCreateContext()之后调用了eglBindAPI(),所以我想我实际上是在创建一个GLES1上下文。

以上是关于glDrawArrays在GLESv2上抛出GL_INVALID_VALUE的主要内容,如果未能解决你的问题,请参考以下文章

glDrawArrays,动态改变正在绘制的点数?

我可以在更新同一个“GL_ARRAY_BUFFER”时多次调用“glDrawArrays”吗?

JsonSerializable - fromJson 在嵌套对象上抛出 _InternalLinkedHashMap<dynamic, dynamic> 异常

通过 gldrawarrays 和 GL_POINTS 溺水时得到带有白色边框的点

为啥 OpenGL 的 glDrawArrays() 在核心配置文件 3.2 下失败并显示 GL_INVALID_OPERATION 而不是 3.3 或 4.2?

json_extract_path_text('[]', 'some_key') 在有效的 json 字符串上抛出错误