首页 > 解决方案 > Android NDK OpenGL ES 3.0 glDrawArrays 和 glDrawElements 抛出 GL_INVALID_OPERATION

问题描述

这是我的顶点着色器代码

#version 300 es
precision mediump float;
precision mediump int;

layout (location = 0) in vec3 pos;

void main(){

    gl_Position = vec4(pos, 1);
}

这是我的片段着色器代码

#version 300 es

precision mediump float;
precision mediump int;

out vec4 FragColor;

void main(){
    FragColor = vec4(0.6, 0.5, 0.7, 1.0);
}

我像这样创建了 VAO、VBO 和 EBO:

GLCall(glGenVertexArrays(1, &vao));
    GLCall(glGenBuffers(1, &vbo));
    GLCall(glGenBuffers(1, &ebo));

    GLfloat vertices[] = {
            // first triangle
            0.5f,  0.5f, 0.0f,  // top right
            0.5f, -0.5f, 0.0f,  // bottom right
            -0.5f,  0.5f, 0.0f,  // top left
            // second triangle
            0.5f, -0.5f, 0.0f,  // bottom right
            -0.5f, -0.5f, 0.0f,  // bottom left
            -0.5f,  0.5f, 0.0f   // top left
    };

    GLuint indices[] = {  // note that we start from 0!
            0, 1, 3,   // first triangle
            1, 2, 3    // second triangle
    };

    GLCall(glBindVertexArray(vao));
    GLCall(glBindBuffer(GL_ARRAY_BUFFER, vbo));
    GLCall(glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW));

    GLCall(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo));
    GLCall(glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW));

    GLCall(glEnableVertexAttribArray(0));
    GLCall(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, (void*)0));

    GLCall(glBindBuffer(GL_ARRAY_BUFFER, 0));
    GLCall(glBindVertexArray(0));

这是我在渲染循环中调用它的方式

void World::render(double dt) {
    glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glClearColor(0.6f, 0.8f, 0.7f, 1.f);

    getShader("Shader").Use();
    GLCall(glBindVertexArray(vao));
    GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, nullptr)); // world.cpp line 59
}

GLCall() 用于检查函数调用中的 OpenGL 错误。我使用 GLSurfaceView 创建一个表面作为示例https://github.com/android/ndk-samples/blob/main/hello-gl2/app/src/main/java/com/android/gl2jni/GL2JNIView.java . 网上试了这么多方法还是没有解决问题,调用glDrawArrays或者glDrawElements后一切正常:

06-10 19:12:33.457 2044-2059/com.example.bricks D/GLRenderer: onSurfaceChanged() called with: gl = [com.google.android.gles_jni.GLImpl@ecf0382], width = [1440], height = [769]
06-10 19:12:33.465 2044-2059/com.example.bricks E/NativeRenderer: OpenGL Error: GL_INVALID_OPERATION in E:/Projects/Android/Bricks/app/src/main/cpp/World.cpp line 59
06-10 19:12:33.466 2044-2059/com.example.bricks E/AndroidRuntime: FATAL EXCEPTION: GLThread 108
    Process: com.example.bricks, PID: 2044
    java.lang.RuntimeException: OpenGL Error: GL_INVALID_OPERATION in E:/Projects/Android/Bricks/app/src/main/cpp/World.cpp line 59
        at com.example.bricks.NativeRenderer.putExceptionString(NativeRenderer.java:70)
        at com.example.bricks.NativeRenderer.nativeRendererOnDrawFrame(Native Method)
        at com.example.bricks.GLRenderer.onDrawFrame(GLRenderer.java:122)
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1535)
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

请帮帮我,致敬!!

标签: androidc++opengl-esopengl-es-3.0

解决方案


推荐阅读