2013-05-17 1 views
0

렌더링을 위해 VAO에서 VBO로 이동할 때 문제가 발생합니다. 안드로이드 플랫폼을 사용하고 있으며 JNI의 OpenGL API를 사용하고 있습니다. 렌더링 할 때 가 여기에이 코드 조각을 사용하여 내 코드 조각Vertex 버퍼 OutOfMemoryError 문제 Object (VBO)

// Initialize in constructor 
GLuint buffer[3]; 
glGenBuffers(3, buffer); 

// In onDrawFrame(), I create draw function. 
// My object data will be dynamically updated during runtime so I used GL_DYNAMIC_DRAW. 

glBindBuffer(GL_ARRAY_BUFFER, buffer[0]); 
glBufferData(GL_ARRAY_BUFFER, genData.cubeNumVerts * 4, genData.vertex, GL_DYNAMIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, buffer[1]); 
glBufferData(GL_ARRAY_BUFFER, genData.cubeColorVerts *4, genData.colors, GL_DYNAMIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, buffer[2]); 
glBufferData(GL_ARRAY_BUFFER, genData.cubeNormalVerts * 4, genData.normals, GL_DYNAMIC_DRAW); 


    if(genData.vertex == 0 || genData.normals == 0 || genData.colors == 0) LOG("Error: failed to allocate a memory"); 


    glBindBuffer(GL_ARRAY_BUFFER, buffer[0]); 
    glEnableVertexAttribArray(vertexHandle); 
    glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0,0); 

    glBindBuffer(GL_ARRAY_BUFFER, buffer[2]); 
    glEnableVertexAttribArray(normalHandle); 
    glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0,0); 

    glBindBuffer(GL_ARRAY_BUFFER, buffer[1]); 
    glEnableVertexAttribArray(mColorHandle); 
    glVertexAttribPointer(mColorHandle, 4, GL_FLOAT, GL_FALSE, 0,0); 

    glDrawArrays(GL_TRIANGLES, 0, genData.cubeNumVerts); 

    glDeleteBuffers(3, buffer); 

, 나는 OutOfMemoryError를 얻었다. 이 오류의 원인을 파악할 수 없었습니다. 누군가가이 스 니펫 코드에서 VBO를 사용하지 않는 것을 알아 채면 나를 도와주세요.

감사

+1

매번 버퍼를 다시 만들 필요가 없습니다. 그들을 재사용하십시오. – Trax

+0

그래, 그게 내가 초기화에 놓은 이유이다. (주석 행을 생성자에 넣었다.) 다른 실수가 있습니까? – deduu

답변

1

glBufferData에 지정된 버퍼 크기 바이트의 데이터 크기이다. 그래서 각각의 버퍼가 numVerts * 4 바이트라고 말합니다. (그리고 나는 그 모든 cube...Verts 숫자가 모두 같기를 바랄 것입니다. 그렇지 않으면 에러와 혼란을 막을 것입니다.) glVertexAttribPointernumVerts * 3 (또는 각각 numVerts * 4) 32 비트 부동 소수점을 가지고 있다고 말합니다. 따라서 numVerts * 3 (or 4) * 4 바이트의 정점 데이터. 따라서 glDrawArrays은 실제 데이터를 읽으므로 일부 액세스 위반 또는 기타 정의되지 않거나 잘못된 동작이 발생할 수 있습니다.

+0

안녕하세요, 모든 큐브 버트 번호가 동일합니다. 하지만 여기에 귀하의 설명을 이해할 수 없습니다 "따라서 numVerts * 3 (또는 4) * 4 바이트 버텍스 데이터입니다. 그래서 glDrawArrays는 실제 데이터를 통해 일부 액세스 위반 또는 기타 정의되지 않은 또는 잘못된 동작이 발생할 가능성이 읽습니다. 더 명확하게 설명 할 수 있습니까? 감사합니다. – deduu

+0

@deduu'glBufferData' 호출로'numVerts * 4' 바이트를 버퍼에 복사합니다. 그런 다음'glVertexAttribPointer'를 호출 할 때 꼭지점 위치가 3 개의 부동 소수점으로 이루어 지므로'3 * 4 = 12' 바이트라고합니다. 'glDrawArrays'로'numVerts' 버텍스를 그릴 때'numVerts * 4' 바이트만을 포함하는 버퍼에서'numVerts * 3 * 4' 바이트를 읽으려고합니다. –

+0

아, 알 겠어 .. 크리스. 고마워. 이제 작동합니다. – deduu

관련 문제