2016-11-04 3 views
0

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!

+0

Haben Sie einen ES 3.0-Kontext erstellt? Können Sie andere ES 3.x-Funktionalität erfolgreich verwenden? –

+0

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

+0

@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

Antwort

0

Dies war ziemlich schmerzhaft, um dieses Problem zu lösen, aber es gibt kein Problem mit dem obigen Code per se. Es war im Grunde das Include. Mein Code befand sich hier der Google-Probe „mehr Teekannen“ beruhte:

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

Ich hatte ihr Muster zu folgen, und ändern Sie meine sind zu GLES aus:

#include <GLES3/gl3.h> 

ihre Stubs zu verwenden:

#include "gl3stub.h" 

warum? Ich weiß es nicht, aber wahrscheinlich verursacht der Linker falschen Code zu verknüpfen.

Verwandte Themen