2014-01-22 2 views
0

간단한 질감의 Box를 표시해야하는 GLSL을 사용하는 간단한 프로그램을 코딩했습니다. 이렇게하려면 'Box.mesh'라는 OBJ 파일을로드하고 그 다음에 정점, 일반, 텍스처 및 인덱스 버퍼에 대한 VBO를 초기화합니다.GLSL 쉐이더를 사용하여 glDrawElement가 충돌 함

o Cube 
v 1.000000 -1.000000 -1.000000 
v 1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 1.000000 
v -1.000000 -1.000000 -1.000000 
v 1.000000 1.000000 -0.999999 
v 0.999999 1.000000 1.000001 
v -1.000000 1.000000 1.000000 
v -1.000000 1.000000 -1.000000 
vt 0.626059 0.265705 
vt 0.626059 0.487398 
vt 0.404365 0.487398 
vt 0.626060 0.930786 
vt 0.404365 0.930786 
vt 0.404365 0.709091 
vt 0.847752 0.487397 
vt 0.847753 0.709091 
vt 0.626059 0.709091 
vt 0.182672 0.487397 
vt 0.626059 0.044011 
vt 0.404366 0.265704 
vt 0.182671 0.709091 
vt 0.404366 0.044011 
vn 0.000000 -1.000000 0.000000 
vn -0.000000 1.000000 0.000000 
vn 1.000000 -0.000000 0.000001 
vn -0.000000 -0.000000 1.000000 
vn -1.000000 -0.000000 -0.000000 
vn 0.000000 0.000000 -1.000000 
vn 1.000000 0.000000 -0.000000 
usemtl BoxMtl 
s off 
f 1/1/1 2/2/1 3/3/1 
f 5/4/2 8/5/2 7/6/2 
f 1/7/3 5/8/3 6/9/3 
f 2/2/4 6/9/4 3/3/4 
f 3/3/5 7/6/5 4/10/5 
f 5/11/6 1/1/6 4/12/6 
f 4/12/1 1/1/1 3/3/1 
f 6/9/2 5/4/2 7/6/2 
f 2/2/7 1/7/7 6/9/7 
f 6/9/4 7/6/4 3/3/4 
f 7/6/5 8/13/5 4/10/5 
f 8/14/6 5/11/6 4/12/6 

그리고 내 프로그램의 코드 조각 :

다음은 Box.mesh 파일 내용의

#define OFFSET_BUFFER(offset) ((char*)NULL + (offset)) 

[...] 

//VBO Initialization 

Basic::OBJReader objReader; 
Basic::OBJImage objImg = objReader.Parse("Box.mesh"); 

GLuint handle[4]; 
glGenBuffers(1, handle); 

std::vector<float> position = objImg.GetVertexPosition(); 

glBindBuffer(GL_ARRAY_BUFFER, handle[0]); 
glBufferData(GL_ARRAY_BUFFER, position.size() * sizeof(GLfloat), &position[0], GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

std::vector<float> normal = objImg.GetVertexNormal(); 

glBindBuffer(GL_ARRAY_BUFFER, handle[1]); 
glBufferData(GL_ARRAY_BUFFER, normal.size() * sizeof(GLfloat), &normal[0], GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

std::vector<float> texture = objImg.GetVertexTexture(); 

glBindBuffer(GL_ARRAY_BUFFER, handle[2]); 
glBufferData(GL_ARRAY_BUFFER, texture.size() * sizeof(GLfloat), &texture[0], GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

std::vector<unsigned int> faces = objImg.GetOBJFaceImageList().at(0).GetFaceData(); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[3]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, faces.size() * sizeof(GLuint), &faces[0], GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

[...] 

/*Main loop*/ 

while (isAlive == true) 
{ 
    [...] 

    glEnableVertexAttribArray(0); 
    glBindBuffer(GL_ARRAY_BUFFER, handle[0]); 
     glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER(0)); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glEnableVertexAttribArray(1); 
    glBindBuffer(GL_ARRAY_BUFFER, handle[1]); 
     glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER(0)); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glEnableVertexAttribArray(2); 
    glBindBuffer(GL_ARRAY_BUFFER, handle[2]); 
     glBindTexture(GL_TEXTURE_2D, textureID); 
     glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, OFFSET_BUFFER(0)); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glBindBuffer(GL_ARRAY_BUFFER, handle[3]); 
     glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, OFFSET_BUFFER(0)); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 

    glDisableVertexAttribArray(2); 
    glDisableVertexAttribArray(1); 
    glDisableVertexAttribArray(0); 

    [...] 
} 

나는 내용과 모든 버퍼의 크기를 확인하고 그들은 올바른 . 그래서 glDrawElements의 첫 번째 호출에서 왜 충돌이 발생했는지 이해할 수 없습니다. 나는 정말로 길을 잃었다. 누구든지 나를 도와 줄 수 있니? 도와 주셔서 미리 감사드립니다. handle[3] 가정

+1

"문제를 진단하기에 충분한 정보가 부족합니다"라는 근거로 투표 결과를 이해하고 있는지 잘 모르겠습니다. 아마도 유권자 중 한 명은 그들이 필요한 추가 정보가 무엇인지 설명하는 의견을 남길 수 있습니다. –

답변

2

이전 glDrawElements (...) 전화에 요소 배열 버퍼, 이것은 잘못입니다 :

glBindBuffer(GL_ARRAY_BUFFER, handle[3]); 

이 있어야합니다 : 더 요소 배열 버퍼가 결합되지 않은

아마도
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, handle[3]); 

,이를 glDrawElements (...)의 최종 매개 변수가 버퍼 객체의 메모리에 대한 오프셋 대신 클라이언트 메모리에 대한 포인터임을 OpenGL에 지시합니다. GL은 정점 인덱스를 가져올 시간이 왔을 때 NULL 포인터를 역 참조하려고 시도합니다. 그러면 이런 일이 발생합니다.

+0

고맙습니다. 사실 논리적이지 않았습니다. 안녕. – user1364743

+0

완벽하게 논리적인데, 단지'glDrawElements (...)'가 어떻게 동작하는지 알 필요가 있습니다. –

+0

glBindBuffer를 GL_ARRAY_BUFFER로 복사/붙여 넣기를하지 않고 플래그를 처리했습니다. 그러나 glDrawElements의 작업을 완벽하게 이해합니다. 나는 다음 번에 더 세심해질 것이다;). 당신의 대답에 다시 한번 감사드립니다. – user1364743