2016-11-04 4 views
0

にクラッシュ:glMapBufferRangeは私がアンドロイドにGLESアプリケーションにいくつかの頂点をモーフィングしようとしていますとglMapBufferRangeは、次のエラーでクラッシュしアンドロイドGLESアプリ

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を使用するアンドロイドアプリケーションです。ハードウェアはSamsung S6の携帯電話です。

thx!

+0

ES 3.0のコンテキストを作成しましたか?他のES 3.xの機能を正常に使用できますか? –

+0

SubObject3D :: MapVBOが実行されているときにSubObject3D :: CreateVBOを実行すると、verticesCount、vertexStride、およびvboIdsが同じであることを確認できますか? – Columbo

+0

@Columboデータまではすべて正しいです。 vboのID、頂点のサイズ、およびストライドは正確で有効です。また、マップ関数を呼び出さないと、オブジェクトを問題なくレンダリングできます。私はコードまで何かを見逃していますか? – gmmo

答えて

0

これはこの問題を解決するのに非常に苦労しましたが、上記のコード自体に問題はありません。それは基本的にインクルードでした。私のコードはここにあるGoogleのサンプル「よりティーポット」オフに基づいた:彼らのスタブを使用する

#include <GLES3/gl3.h> 

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

私は彼らのパターンに従うと、変更しなければならなかった私からGLESに含まれます:

#include "gl3stub.h" 

なぜですか?私は分かりませんが、おそらくリンカーが間違ったコードをリンクさせる原因になります。

関連する問題