2012-11-01 25 views
7

次のPythonプログラムでは、ウィンドウの右上象限に白い三角形を描く必要があります。PythonとPyOpenGLでVBOを動作させる方法

import pygame 
from OpenGL.GL import * 
from ctypes import * 

pygame.init() 
screen = pygame.display.set_mode ((800,600), pygame.OPENGL|pygame.DOUBLEBUF, 24) 
glViewport (0, 0, 800, 600) 
glClearColor (0.0, 0.5, 0.5, 1.0) 
glEnableClientState (GL_VERTEX_ARRAY) 

vertices = [ 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0 ] 
vbo = glGenBuffers (1) 
glBindBuffer (GL_ARRAY_BUFFER, vbo) 
glBufferData (GL_ARRAY_BUFFER, len(vertices)*4, (c_float*len(vertices))(*vertices), GL_STATIC_DRAW) 

running = True 
while running: 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      running = False 

    glClear (GL_COLOR_BUFFER_BIT) 

    glBindBuffer (GL_ARRAY_BUFFER, vbo) 
    glVertexPointer (3, GL_FLOAT, 0, 0) 

    glDrawArrays (GL_TRIANGLES, 0, 3) 

    pygame.display.flip() 

エラーは発生しませんが、残念ながら三角形は描画されません。

Iはまた、numpyのアレイとしてバッファデータを送信しようとした:

glBufferData (GL_ARRAY_BUFFER, len(vertices)*4, np.array (vertices, dtype="float32"), GL_STATIC_DRAW) 

ない場合も三角形が描かれていません。 PyOpenGL ...いいえ、VBOを描画しませんか?

マイ・システム:Python 2.7.3; OpenGL 4.2.0; 64ビット

答えて

5

オーケーLinuxのミントマヤは、私はちょうどそれを見つけた:

glVertexPointer呼び出しが、私は最後の夜時間の検索、私は誓うNULLポインタ

glVertexPointer (3, GL_FLOAT, 0, None) 

を表すNone、でなければならないの4番目のパラメータそれを見ませんでした。

+1

["Vertex Buffer Object"についてのGoogleの2番目のヒット](http://www.songho.ca/opengl/gl_vbo.html) –

+0

灰色の髪から私を救ったああ。これは 'GL.glVertexAttribPointer(0、4、GL.GL_FLOAT、GL.GL_FALSE、0、None)'と同じです。最後のパラメータとして '0'を渡すことはおそらくC/C++コードでは機能しますが、明らかにPyOpenGLでは機能しません。それは 'None'でなければなりません。私はこれを見つける前に数時間のデバッグをしました。私はすでに狂っていた。あなたは私を救った、ありがとう! –

+0

最後のパラメータはGLvoid *型で、ctypes.c_void_p(オフセット)に変換する必要があります。[link](https://bitbucket.org/tartley/gltutpy/src/tip/t02.playing-with-colors /VertexColors.py) – Adrian

関連する問題