Android OpenGL ES 3.0 在按钮单击时更新 VBO 数据?

发布于 2025-01-10 22:05:10 字数 1802 浏览 4 评论 0原文

有没有办法动态绘制网格。 就像按下按钮一样,将新的浮点数组发送到 openGL ES 30 VBO。 目前我在 Native C++ 中绘制矩形和三角形 STATIC 它们是可见的,但是当我使用 JNI 从 java 传递三角形数组时。我收到一个错误

在没有当前上下文的情况下调用 OpenGL ES API(每个线程记录一次)

本机 C++。

GLuint fvao, bvao;
GLuint VBO[2];

void setupBuffers() {
    glGenVertexArrays(1,&bvao);
    glBindVertexArray(bvao);
    glGenBuffers(1, &VBO[0]);
    glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(rect), rect, GL_STATIC_DRAW);
    .
    .
    .

    
    // Triangle --------------------------------------
    glGenVertexArrays(1,&fvao);
    glBindVertexArray(fvao);
    glGenBuffers(1, &VBO[1]);
    glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
    glBufferData(GL_ARRAY_BUFFER, 0, nullptr, GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);   // pos
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(0 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);   // color
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
    glEnableVertexAttribArray(2);   // texture
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
    glBindVertexArray(0);   //Unbind VAO

}


// UPDATE -----------------------
void updateBuffer(float triangle[]) {
    glBindBuffer(GL_ARRAY_BUFFER, VBO[1]); //Bind array for OpenGL to use
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}


// update Buffer JNI
extern "C" JNIEXPORT void JNICALL
Java_com_test_nativetest_GL3JNILib_update(JNIEnv * env, jclass obj, jfloatArray triangle)
{
    updateBuffer(triangle);
}

如果有人可以告诉我我遗漏了什么或做错了什么。任何帮助将不胜感激。

Is there any way to draw mesh dynamically.
like on press of a button send new float array to openGL ES 30 VBO.
currently i draw both rectangle and triangle STATIC in Native C++ they are visible, But when i pass triangle array from java using JNI. I got an error

call to OpenGL ES API with no current context (logged once per thread)

Native C++.

GLuint fvao, bvao;
GLuint VBO[2];

void setupBuffers() {
    glGenVertexArrays(1,&bvao);
    glBindVertexArray(bvao);
    glGenBuffers(1, &VBO[0]);
    glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
    glBufferData(GL_ARRAY_BUFFER, sizeof(rect), rect, GL_STATIC_DRAW);
    .
    .
    .

    
    // Triangle --------------------------------------
    glGenVertexArrays(1,&fvao);
    glBindVertexArray(fvao);
    glGenBuffers(1, &VBO[1]);
    glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
    glBufferData(GL_ARRAY_BUFFER, 0, nullptr, GL_DYNAMIC_DRAW);
    glEnableVertexAttribArray(0);   // pos
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(0 * sizeof(GLfloat)));
    glEnableVertexAttribArray(1);   // color
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
    glEnableVertexAttribArray(2);   // texture
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6 * sizeof(GLfloat)));
    glBindVertexArray(0);   //Unbind VAO

}


// UPDATE -----------------------
void updateBuffer(float triangle[]) {
    glBindBuffer(GL_ARRAY_BUFFER, VBO[1]); //Bind array for OpenGL to use
    glBufferData(GL_ARRAY_BUFFER, sizeof(triangle), triangle, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}


// update Buffer JNI
extern "C" JNIEXPORT void JNICALL
Java_com_test_nativetest_GL3JNILib_update(JNIEnv * env, jclass obj, jfloatArray triangle)
{
    updateBuffer(triangle);
}

If anyone can tell me what i am missing or doing wrong. Any help would be appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文