2013-12-10 4 views
0

파이썬과 PyOpenGL을 사용하여 지오메트리를 표시하기 위해 인터리브 된 VBO을 사용하고 있습니다.glVertexPointer(), glNormalPointer - PyOpenGL의 보폭 및 포인터 매개 변수

[vx1, vy1, vz1, nx1, ny1, nz1, R1, G1, B1, vx2...] 

그리기 코드로 만든 : :이 VBO는 정점, 법선과 색상으로 구성되어

glEnableClientState(GL_VERTEX_ARRAY) 
glEnableClientState(GL_NORMAL_ARRAY) 
glEnableClientState(GL_COLOR_ARRAY) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self.vbo_id) 

v_pointer = None 
n_pointer = ctypes.c_void_p(12) 
c_pointer = ctypes.c_void_p(24) 

v_stride = 24 
n_stride = 24 
c_stride = 24 

glVertexPointer(3, 
       GL_FLOAT, 
       v_stride, 
       v_pointer) 
glNormalPointer(GL_FLOAT, 
       n_stride, 
       n_pointer) 
glColorPointer(3, 
       GL_FLOAT, 
       c_stride, 
       c_pointer) 

glDrawArrays(GL_TRIANGLES,  #POINTS 
      0, 
      self.len_) 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) # reset 
glDisableClientState(GL_COLOR_ARRAY) 
glDisableClientState(GL_NORMAL_ARRAY) 
glDisableClientState(GL_VERTEX_ARRAY) 

표시되는 구조가 간단한 큐브해야하지만, 내가 할 모든 무작위 지향 삼각형 (그림 참조입니다). PyOpenGL here에서 glVertexPointer() 문제를 읽었으며 solutionctypes.c_void_p()으로 찾았지만 구현 방법을 잘 모르겠습니다. 누군가 내가 여기서 잘못하거나 잘못하고있는 것을 지적 할 수 있습니까? 또는 어떻게 해결할 수 있습니까?

documentation을 기반으로 stride 매개 변수는 VBO 배열에있는 동일한 유형 (정점, 법선, 색상 ...)의 연속 된 두 배열 (바이트) 사이에서 오프셋됩니다. 안 그래요?

drawn triagles

답변

0

나는 법선에 대한 문제를 해결했다. 코드는 다음과 같습니다.

v_pointer = ctypes.c_void_p(0) # or None 
    n_pointer = ctypes.c_void_p(12) 
    c_pointer = ctypes.c_void_p(24) 

    v_stride = 36 
    n_stride = 36 
    c_stride = 36 

그러나 모델이 다채롭지 않아도 여전히 색상에 문제가 있습니까? :) 어떤 아이디어라도 높이 평가됩니다.

관련 문제