android - 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)
请帮帮我,致敬!!
解决方案
推荐阅读
- twilio - 使用 Twilio 验证和 Twilio 功能进行无服务器电话验证
- ios - Xcode 11.1 尝试在 Safari 浏览器的登录屏幕中记录以编写 UI 测试时崩溃
- django - 在一个字段上过滤并在另一个字段上排序时 Django 模型的最佳索引
- android - 使用 Android 应用运行 Google Assistant Command
- c# - 用括号作为属性名称的新对象
- javascript - 迁移学习 Tensorflow.js 大小/形状错误
- git - Git 功能分支:我可以将它们放在子目录中吗
- html - Angular 8 routerLinks 使用 # 到 %23 创建解码的 href
- java - 为什么 jshell 使用 StackWalker 返回空字符串
- .net - Microsoft.Diagnostics.Tracing.EventSource 与 RabbitMQ.Client.dll 异常