【问题标题】:Point position doesn't change even if the data in glBufferData change即使 glBufferData 中的数据发生变化,点位置也不会改变
【发布时间】:2021-10-04 04:01:16
【问题描述】:

代码:

import glfw
import numpy as np
from OpenGL.GL import *

def main():
    if not glfw.init():
        raise RuntimeError('Can not initialize glfw library')
    window = glfw.create_window(500, 500, 'Demo', None, None)
    if not window:
        glfw.terminate()
        raise RuntimeError('Can not create glfw window')
    glfw.make_context_current(window)

    glClearColor(0, 0, 0, 1)
    glColor(1, 0, 0, 1)
    glPointSize(10.0)

    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)

    # The result of following two lines are looks the same
    # glBufferData(GL_ARRAY_BUFFER, np.array([0, 0, 0], dtype='float32'), GL_STATIC_DRAW)
    glBufferData(GL_ARRAY_BUFFER, np.array([999999999, 999999999, 999999999], dtype='float32'), GL_STATIC_DRAW)

    while not glfw.window_should_close(window):
        glClear(GL_COLOR_BUFFER_BIT)

        glEnableVertexAttribArray(0)
        glBindBuffer(GL_ARRAY_BUFFER, VBO)
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0)
        glDrawArrays(GL_POINTS, 0, 1)
        glDisableVertexAttribArray(0)

        glfw.swap_buffers(window)
        glfw.poll_events()

    glfw.terminate()

if __name__ == "__main__":
    main()

我正在学习 OpenGL,我正在尝试按照教程 here 进行操作。但是,我发现即使更改“glBufferData”中的数据,该点的位置也不会改变。

我不知道这是怎么发生的。函数 glBufferData 不起作用吗?或者我犯了一些低级错误。

【问题讨论】:

  • 你的顶点着色器代码在哪里?
  • 我只是跟着一个教程,我不知道什么是顶点着色器代码。我需要那个吗?这个程序可以在没有顶点着色器代码的情况下运行吗?

标签: python opengl pyopengl


【解决方案1】:

如果绑定了命名缓冲区对象,则 glVertexAttribPointer 的第 6 个参数将被视为缓冲区对象数据存储中的字节偏移量。但是参数的类型是c_void_p

如果偏移量为 0,那么第 6 个参数可以是Nonec_void_p(0),否则偏移量必须被种姓为c_void_p(0)

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0)

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)

小例子:

import glfw
import numpy as np
from OpenGL.GL import *

def main():
    if not glfw.init():
        raise RuntimeError('Can not initialize glfw library')
    window = glfw.create_window(500, 500, 'Demo', None, None)
    if not window:
        glfw.terminate()
        raise RuntimeError('Can not create glfw window')
    glfw.make_context_current(window)

    glClearColor(0, 0, 0, 1)
    glColor(1, 0, 0, 1)
    glPointSize(10.0)

    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)
    glBufferData(GL_ARRAY_BUFFER, np.array([0.2, -0.2, 0, -0.2, -0.2, 0, 0, 0.2, 0], dtype='float32'), GL_STATIC_DRAW)

    while not glfw.window_should_close(window):
        glClear(GL_COLOR_BUFFER_BIT)

        glEnableVertexAttribArray(0)
        glBindBuffer(GL_ARRAY_BUFFER, VBO)
        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)
        glDrawArrays(GL_POINTS, 0, 3)
        glDisableVertexAttribArray(0)

        glfw.swap_buffers(window)
        glfw.poll_events()

    glfw.terminate()

if __name__ == "__main__":
    main()

【讨论】:

  • 非常感谢!我仍然很困惑为什么 0 偏移量与 c_void_p(0) 不同。如果我需要将偏移量设置为 2 怎么办?我是否将 c_void_p(2) 传递给第 6 个参数?
  • @Finn 是的c_void_p(2)。不要打扰你。底层 c 类型是void*。 PyOpenGL 在这里需要一个 pointer 并且 int 无论出于何种原因都不起作用。 (见glVertexAttribPointer)。
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-11
相关资源
最近更新 更多