PyOpenGL:忽略顶点缓冲区对象的内容

时间:2015-02-01 20:14:23

标签: python opengl pyopengl

我正在尝试使用http://ogldev.atspace.co.uk上的教程来掌握'现代'OpenGL,使用PyOpenGL在Python 3中工作,并参考this

目前我只想在屏幕上的不同位置绘制一个点,但无论我在VBO中输入的数据如何,该点总是在屏幕的中心绘制。

我发现this question看起来很相似,但他提到的rewind()函数看起来特定于LWJGL,所以我猜这里不适用。

我的代码的相关位如下:

import sdl2
import numpy
from OpenGL import GL

def _init_gl(self):
    self._gl_context = sdl2.SDL_GL_CreateContext(self._window.window)
    GL.glClearColor(0, 0, 0, 1)

    self._vao = GL.glGenVertexArrays(1)
    GL.glBindVertexArray(self._vao)

    self._vbo = GL.glGenBuffers(1)
    GL.glBindBuffer(GL.GL_ARRAY_BUFFER, self._vbo)
    vertexData = numpy.array([0.5, 0.5, 0.0], dtype=numpy.float32)
    GL.glBufferData(GL.GL_ARRAY_BUFFER, vertexData.nbytes, vertexData,
                    GL.GL_STATIC_DRAW)
    GL.glEnableVertexAttribArray(0);
    GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 0, None)

def _draw(self):
    GL.glClear(GL.GL_STENCIL_BUFFER_BIT |
               GL.GL_DEPTH_BUFFER_BIT |
               GL.GL_COLOR_BUFFER_BIT)
    GL.glBindVertexArray(self._vao)
    GL.glDrawArrays(GL.GL_POINTS, 0, 1)

    sdl2.SDL_GL_SwapWindow(self._window.window)

有人能发现可能出错的地方吗?

1 个答案:

答案 0 :(得分:1)

您正在使用通用顶点属性:

GL.glEnableVertexAttribArray(0);
GL.glVertexAttribPointer(0, 3, GL.GL_FLOAT, GL.GL_FALSE, 0, None)

通用属性与着色器结合使用,您在发布的代码中没有这些属性。尝试在没有着色器的情况下使用它们可能至少在某些平台上在某些条件下工作,但它通常会令人失望。

只要您使用旧版固定功能管道,就应该使用固定功能属性。设置顶点位置的匹配调用是:

GL.glEnableClientState(GL.GL_VERTEX_ARRAY)
GL.glVertexPointer(3, GL.GL_FLOAT, 0, None)

另一个选择是您完全承诺使用OpenGL核心配置文件,并为您的代码添加着色器。您正在学习的教程中的后续步骤之一描述了如何执行此操作。