我试图在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手机。
THX!
答案 0 :(得分:0)
解决此问题非常痛苦,但上面的代码本身没有问题。它基本上是包括。我的代码基于谷歌样本"更多的茶壶"位于:
https://github.com/googlesamples/android-ndk/tree/master/teapots
我必须遵循他们的模式并将我的include更改为GLES:
#include <GLES3/gl3.h>
使用他们的存根:
#include "gl3stub.h"
为什么呢?我不知道,但可能导致链接器链接错误的代码。