2011-11-15 3 views
26

저는 3 차원 OpenGL의 한 점을 배우고 있습니다. 이제는 좋은 카메라가 움직이며 몇 가지 간단한 큐브 개체가 있습니다. 현재 버텍스 배열을 사용하고 있지만 여기 VBO로 빠르게 스와핑하고 있습니다.어떤 순서로 내 꼭지점을 도려내 기 위해 OpenGL에 보내야합니까?

void cube::update_verts(){ 
GLushort cur=0; 

///back face 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z; 

///right face 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz; 

///top face 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz; 

///front face 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz; 

///bottom face 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz; 

///left face 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz; 


} 

///Drawing Code: 

glVertexPointer(3,GL_FLOAT,0,object.verts); 
glColorPointer(3,GL_UNSIGNED_BYTE,0,object.colors); 
glDrawArrays(GL_QUADS,0,6*4); 

그것을 확실히 매우 잘못 그러나, 때문에 : 난 그냥하지만 ​​내 정점을 지정 어떤 순서로 내가한다고하는 확실하지 않다, 컬링을 활성화하기 위해 노력하고있어, 지금이 내가 뭘하는지입니다 glEnable(GL_CULL_FACE); 내 큐브에 올바른 얼굴이 표시되지 않습니다 (아래 참조). 컬링 이러한 이미지의 모두에 문제가 아이 View From Side

정상 Regular View From Top

이 활성화됩니다.

정점을 어떤 순서로 지정해야합니까?


(EDIT) 업데이트 작업 기능 : 기본적으로

void cube::update_verts(){ 
GLushort cur=0; 

///top face 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z; 


///bottom face 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz; 

///left face 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z; 

///right face 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz; 

///front face 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z+sz; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z+sz; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z+sz; 


///back face 
verts[cur++]=x; verts[cur++]=y; verts[cur++]=z; 
verts[cur++]=x; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y+sy; verts[cur++]=z; 
verts[cur++]=x+sx; verts[cur++]=y; verts[cur++]=z; 

} 

답변

관련 문제