繁体   English   中英

glMapBufferRange在Android GLES应用程序上崩溃

[英]glMapBufferRange crashing on Android GLES app

我试图在android上的GLES应用程序上变形一些顶点,glMapBufferRange不断崩溃,出现以下错误:

SIGSEGV(信号SIGSEGV:地址访问受保护(故障地址:0xef13d664))

我或多或少地遵循了这个网站的例子:

http://www.songho.ca/opengl/gl_vbo.html#update

但不确定我是否遗漏了什么。

我在初始化时创建了VBO,我可以毫无问题地绘制对象。 创作代码如下:

void SubObject3D::CreateVBO(VBOInfo &vboInfoIn) {
    // m_vboIds[0] - used to store vertex attribute data
    // m_vboIds[l] - used to store element indices
    glGenBuffers(2, vboInfoIn.vboIds);

    // Let the buffer all dynamic for morphing
    glBindBuffer(GL_ARRAY_BUFFER, vboInfoIn.vboIds[0]);
    glBufferData(GL_ARRAY_BUFFER,
                 (GLsizeiptr) (vboInfoIn.vertexStride * vboInfoIn.verticesCount),
                 vboInfoIn.pVertices, GL_DYNAMIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboInfoIn.vboIds[1]);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,
                 (GLsizeiptr) (sizeof(GLushort) * vboInfoIn.indicesCount),
                 vboInfoIn.pIndices, GL_STATIC_DRAW);
}

struct VBOInfo {
    VBOInfo() {
        memset(this, 0x00, sizeof(VBOInfo));
        vboIds[0] = 0xdeadbeef;
        vboIds[1] = 0xdeadbeef;
    }

    // VertexBufferObject Ids
    GLuint vboIds[2];

    // Points to the source data
    GLfloat *pVertices;         // Pointer of original data
    GLuint verticesCount;
    GLushort *pIndices;         // Pointer of original data
    GLuint indicesCount;

    GLint vertexStride;
};

然后在渲染循环中,我试图抓住我的顶点指针,如下所示:

// I stored the information at creation time here:
VBOInfo mVBOGeometryInfo;
//later I call here to get the pointer
GLfloat *SubObject3D::MapVBO() {
    GLfloat *pVertices = nullptr;

    glBindBuffer(GL_ARRAY_BUFFER, mVBOGeometryInfo.vboIds[0]);

    GLsizeiptr length = (GLsizeiptr) (mVBOGeometryInfo.vertexStride *
                                      mVBOGeometryInfo.verticesCount);
    pVertices = (GLfloat *) glMapBufferRange(
            GL_ARRAY_BUFFER, 0,
            length,
            GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT
    );

    if (pVertices == nullptr) {
        LOGE ("Could not map VBO");
    }
    return pVertices;
}

但它在glMapBufferRange上崩溃了。

这是一个使用NDK的Android应用程序。 硬件是三星S6手机。

谢谢!

解决此问题非常痛苦,但上面的代码本身没有问题。 它基本上是包括。 我的代码基于谷歌样本“更多茶壶”位于此处:

https://github.com/googlesamples/android-ndk/tree/master/teapots

我必须遵循他们的模式并将我的包含更改为GLES:

#include <GLES3/gl3.h>

使用他们的存根:

#include "gl3stub.h"

为什么? 我不知道,但可能导致链接器链接错误的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM