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

PyOpenGL: Contents of vertex buffer object ignored

我正在尝试使用 http://ogldev.atspace.co.uk to get a grip on 'modern' OpenGL, working in Python 3 with PyOpenGL, with some reference to 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)

谁能发现可能出了什么问题?

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

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 Core Profile,并将着色器添加到您的代码中。您所遵循的教程中的后续步骤之一描述了如何执行此操作。