2012-11-16 5 views
1

인덱싱을 사용할 때 VBO에서 법선을 올바르게 렌더링하는 데 약간의 문제가 있습니다. 나는 정상적인 포인터에 대한 나의 오프셋이 잘못된 것이라고 확신하지만, 수학은 나에게 덧붙이는 것처럼 보인다.VBO 조명 및 인덱싱

나는 데이터 저장 방법 : VBO없이

if(UsingVBO == false) 
{ 
    glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0); 
    glBegin(GL_TRIANGLES); 
     for(int i = 0; i < NumOfF*3; i+=3) 
     { 
      glNormal3f(ModelV[ModelI[i]].nx, ModelV[ModelI[i]].ny, ModelV[ModelI[i]].nz); 
      glVertex3f(ModelV[ModelI[i]].x, ModelV[ModelI[i]].y, ModelV[ModelI[i]].z); 

      glNormal3f(ModelV[ModelI[i+1]].nx, ModelV[ModelI[i+1]].ny, ModelV[ModelI[i+1]].nz); 
      glVertex3f(ModelV[ModelI[i+1]].x, ModelV[ModelI[i+1]].y, ModelV[ModelI[i+1]].z); 

      glNormal3f(ModelV[ModelI[i+2]].nx, ModelV[ModelI[i+2]].ny, ModelV[ModelI[i+2]].nz); 
      glVertex3f(ModelV[ModelI[i+2]].x, ModelV[ModelI[i+2]].y, ModelV[ModelI[i+2]].z); 
     } 
    glEnd(); 
} 
else 
{ 
    glRotatef(Timer.getElapsedTime().asSeconds() * 10, 0, 1, 0); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 

    glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), 0); 
    glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)(NumOfV*sizeof(float)));//Number of vertices times size of float 
    glDrawElements(GL_TRIANGLES, NumOfF*3, GL_UNSIGNED_INT, 0);//number of indices 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
} 

렌더링 :

GLuint VertexVBOID, IndexVBOID; 
glGenBuffers(1, &VertexVBOID); 
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertex)*NumOfV, &ModelV[0].x, GL_STATIC_DRAW); 

glGenBuffers(1, &IndexVBOID); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*NumOfF*3, &ModelI[0], GL_STATIC_DRAW); 

코드 렌더링 내 : 나는 VBO를 설정하는 방법

다음
struct MyVertex 
{ 
    float x, y, z;  //Vertex 
    float nx, ny, nz;  //Normal 
}; 

인을

Pic1

VBO로 렌더링 :

Pic2

+0

중복 가능성 (http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –

+0

그래도 꼭지점을 재사용 할 수있는 색인 도구가 필요하지 않습니까? 그게 내가 여기에서 얻은 것입니다 : [link] (http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/) - "이 튜토리얼에서는 재사용을 가능하게하는 인덱싱을 소개합니다 동일한 꼭지점을 반복해서 반복 할 수 있습니다. 이것은 인덱스 버퍼를 사용하여 수행됩니다. " – LucasS

+0

정점이 위치가 아닙니다. 정점 *에는 위치가 포함되어 있지만 꼭 그런 것은 아닙니다. 법선, 색상, 텍스처 좌표 또는 원하는 속성을가집니다. 정점 공유는 가능하지만 패싯 객체를 렌더링하는 경우 * 아닙니다 *. 당신이하는 방식. 꼭지점이 아닌 꼭지점마다 법선이 필요합니다. –

답변

2
glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)(NumOfV*sizeof(float)));//Number of vertices times size of float 

귀하의 offset is wrong 여기. 인터리브 된 정점 데이터를 제공하므로 처음 세 개의 부동 소수점이 사용자 위치이고 다음 세 개의 부동 소수점이 법선입니다. 따라서 법선에 대한 기본 오프셋은 (위치를 건너 뛰기 위해) 3 자리의 바이트로 계산됩니다. NumOfV은 전체 모델에있는 의 정점 수입니다. MyVertex 데이터 구조에있는 위치의 부동 소수점 수는 아닙니다.

가 가장 the offsetof macro으로 수행된다 : 다수의 인덱스 렌더링 메쉬]의

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (void*)offsetof(MyVertex, x)); 
glNormalPointer(GL_FLOAT, sizeof(MyVertex), (void*)offsetof(MyVertex, nx)); 
+0

설명해 주셔서 감사합니다. 지금은 매력처럼 작동합니다. – LucasS