Ich versuche, einige Eckpunkte auf einer GLES Anwendung morphen auf Android und glMapBufferRange hält mit dem folgenden Fehler Absturz:glMapBufferRange Absturz auf Android GLES App
SIGSEGV (Signal SIGSEGV: Adresse Zugang (Fehleradresse geschützt: 0xef13d664))
ich mehr oder weniger folgte dem Beispiel dieser Web-Site:
http://www.songho.ca/opengl/gl_vbo.html#update
aber nicht sicher, ob ich bin etwas fehlt.
Ich habe meine VBOs bei der Initialisierung erstellt und ich kann das Objekt ohne Probleme zeichnen. Der Code der Schöpfung geht:
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;
};
dann später in der Rendering-Schleife Ich habe versucht, die halten, meine Vertex Zeiger als solche zu erhalten:
// 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;
}
aber es stürzte direkt am glMapBufferRange.
Dies ist eine Android-Anwendung, die NDK verwendet. Die Hardware ist ein Samsung S6 Telefon.
thx!
Haben Sie einen ES 3.0-Kontext erstellt? Können Sie andere ES 3.x-Funktionalität erfolgreich verwenden? –
Könnten Sie überprüfen, ob VerticesCount, VertexStride und VboIds identisch sind, wenn SubObject3D :: CreateVBO so ausgeführt wird, wie sie sind, wenn SubObject3D :: MapVBO ausgeführt wird? – Columbo
@Columbo ist alles korrekt soweit Daten. Die vbo Ids, Vertex Größe und Schritt sind korrekt und gültig. Plus, wenn ich die Kartenfunktion nicht rufe, kann ich das Objekt kein Problem machen. Fehle ich etwas so weit wie Code? – gmmo