2016-11-04 2 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를 사용하는 안드로이드 응용 프로그램입니다. 하드웨어는 삼성 S6 폰입니다.

xx!

+0

ES 3.0 컨텍스트를 만들었습니까? 다른 ES 3.x 기능을 성공적으로 사용할 수 있습니까? –

+0

SubObject3D :: MapVBO가 실행될 때 SubObject3D :: CreateVBO가 실행될 때 verticesCount, vertexStride 및 vboIds가 동일하다는 것을 확인할 수 있습니까? – Columbo

+0

@Columbo 데이터까지 모두 정확합니다. vbo ID, 정점 크기 및 보폭은 정확하고 유효합니다. 게다가 map 함수를 호출하지 않으면 객체를 아무런 문제없이 렌더링 할 수 있습니다. 나는 코드까지 뭔가를 놓쳤는가? – gmmo

답변

0

이 문제를 해결하는 것은 매우 어려웠지만 위의 코드 자체에는 아무런 문제가 없습니다. 그것은 기본적으로 포함되었습니다. 내 코드가 여기에 구글 샘플 "더 찻 주전자"기초한다 : 자신의 스텁을 사용하는

#include <GLES3/gl3.h> 

:

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

내가 그들의 패턴을 따라 변경했다 내에서 GLES을 ​​포함한다 :

#include "gl3stub.h" 

왜? 모르겠지만 링커가 잘못된 코드를 링크 할 가능성이 있습니다.

관련 문제