2017-10-18 3 views
1

PyOpenGL을 배우기 시작했고, this 튜토리얼을 따르고 있습니다. 어느 곳에서 강사 그 삼각형 구성하는 정보를 추출하는 하나의 어레이 작성이 배열의 정보에 glVertexPointer() and glColorPointer()에 전달PyOpenGL의 단일 배열에서 glVertexPointer() 및 glColorPointer() 데이터를 추출하는 방법은 무엇입니까?

#-----------|-Vertices pos--|---Colors----|----------- 
vertices = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0, 
      0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 
      0.0, 0.5, 0.0, 0.0, 0.0, 1.0] 

vertices = np.array(vertices, dtype = np.float32) 

: vetices 그들의 색 (I 여기 NumPy와 라인을 추가) 디스플레이 기능 :

def display(): 

    glClear(GL_COLOR_BUFFER_BIT)  
    glEnableClientState(GL_VERTEX_ARRAY) 
    glEnableClientState(GL_COLOR_ARRAY) 

    glVertexPointer(3, GL_FLOAT, 12, vertices) 
    glColorPointer(3, GLFLOAT, 12, vertices + 3) 

    glDrawArrays(GL_TRIANGLES, 0, 3) 

    glDisableClientState(GL_VERTEX_ARRAY) 
    glDisableClientState(GL_COLOR_ARRAY) 
    glutSwapBuffers() 

내 문제는 (그가 C++를 사용하기 때문에), 그 세 번째 위치에서 읽기 시작하는 프로그램을 이야기하기 위해 vertices + 3을 쓸 수 튜토리얼에서, 이러한 기능의 마지막 인수입니다 배열의, 나는 파이썬에서 이것을 할 수 없습니다. 이 포인터를 어떻게 정의 할 수 있습니까? 또는 어떻게 내 배열에서 정보를 추출 할 수 있습니다.

참고 : 각기 다른 배열의 정점 및 색상 정보를 나눌 수 있지만 하나의 배열을 사용하여 정점 및 색상 정보를 분리 할 수 ​​있는지 알고 싶습니다.

편집 - 전체 코드 추가는 :

from OpenGL.GL import * 
from OpenGL.GLUT import * 
import numpy as np 
import ctypes 

#-----------|-Vertices pos--|---Colors----|----------- 
vertices = [-0.5, -0.5, 0.0, 1.0, 0.0, 0.0, 
      0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 
      0.0, 0.5, 0.0, 0.0, 0.0, 1.0] 
vertices = np.array(vertices, dtype = np.float32) 

buffer_offset = ctypes.c_void_p 
float_size = ctypes.sizeof(ctypes.c_float) 

#----------------------------------------------------- 

def display(): 

    glClear(GL_COLOR_BUFFER_BIT)  
    glEnableClientState(GL_VERTEX_ARRAY) 
    glEnableClientState(GL_COLOR_ARRAY) 

    glVertexPointer(3, GL_FLOAT, 24, buffer_offset(vertices.ctypes.data)) 
    glColorPointer(3, GL_FLOAT, 24, buffer_offset(vertices.ctypes.data + float_size * 3)) 

    glDrawArrays(GL_TRIANGLES, 0, 3) 

    glDisableClientState(GL_VERTEX_ARRAY) 
    glDisableClientState(GL_COLOR_ARRAY) 
    glutSwapBuffers() 

def reshape(w,h): 
    glViewport(0,0,w,h) 

def initOpenGL(): 
    glClearColor(0,0,0,1) 

#----------------------------------------------------- 

glutInit() 
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH) 
glutInitWindowSize(500,500) 
glutCreateWindow(b'Test') 

glutDisplayFunc(display) 
glutIdleFunc(display) 
glutReshapeFunc(reshape) 

initOpenGL() 
glutMainLoop() 

답변

1

이것은 당신이 정점 버퍼가 구속 여부가 있는지 여부에 따라 달라집니다. 마지막 매개 변수 pointergl*Pointer()입니다.

  • 없음 버텍스 버퍼 바운드 : 그것은
  • 버텍스 버퍼 바운드 정점에 주소입니다 : 그것은

당신은 ctypes를 이용할 수있는 버퍼의 주소와 관련하여 오프셋 상대의 이것 때문에.

import ctypes 

buffer_offset = ctypes.c_void_p 
float_size = ctypes.sizeof(ctypes.c_float) 

당신이 정점 버퍼를 바인딩 한 가정, 당신은 간단 할 거라고 :

glVertexPointer(3, GL_FLOAT, 12, buffer_offset(0)) 
glColorPointer(3, GLFLOAT, 12, buffer_offset(float_size * 3)) 

당신은 그냥 배열하고 다른 아무것도를 사용하는 경우, 당신이 바로 주소를 얻을 수있는 가정 것이다 그것을 균등하게 상쇄합니다.

glVertexPointer(3, GL_FLOAT, 12, buffer_offset(vertices.ctypes.data)) 
glColorPointer(3, GLFLOAT, 12, buffer_offset(vertices.ctypes.data + float_size * 3)) 

는하지만 파이썬에서이 필요성을 본 적이, 그래서 그것을 확인할 수없는, 인정해야한다.

+0

대단히 감사합니다. 마지막으로 추가 한 정보로 작업했습니다. 나는 아직도 무엇을하고 있는지 분명하지 않다. 그러나 나는 알아낼 것이다. 고맙습니다. –

+0

당신을 진심으로 환영합니다! 'vertices.ctypes.data'는 배열의 주소를 반환합니다. 따라서 주소에서 첫 번째 4 바이트 (float의 크기)는 '꼭짓점'의 첫 번째 요소가됩니다 (4 바이트마다). 따라서 'address + 4 * 3'을 취하면 첫 번째 색상 요소의 주소가됩니다. 당신은 이미 스트라이드 (24 바이트)를 말하기 때문에 시작 주소 만 알면됩니다. 보폭은 6 개의 수레 (X, Y, Z, R, G, B)가 있기 때문에 24 바이트입니다. '6 floats * 4 float_size = 24 bytes'입니다. – Vallentin

관련 문제