gpt4 book ai didi

python - 基本的 openGL、顶点缓冲区和 pyglet

转载 作者:太空狗 更新时间:2023-10-29 22:23:54 26 4
gpt4 key购买 nike

编辑:rotoglup 在我的代码中发现了问题,添加我已删除的着色器完成了解决方案。请参阅下面我的答案以获取正确的代码(带有着色器)。

大家好!

我正在尝试从 this tutorial 学习现代 OpenGL 的一些基础知识.

虽然我想用 python/pyglet 而不是 C++ 来完成它。我知道 pyglet 可以抽象掉大部分低级 OpenGL;不过,我想先了解一些基础知识,然后再将它们隐藏在抽象层之后。

我的问题非常简单:下面的代码只绘制了一个点,而不是我期望的 3 个点。据我所知,我的代码与教程中的 C++ 相同,除了删除了顶点和片段着色器(通过 python 中的 gletools 完成),这似乎对我的问题没有影响。

将事物简化为一个点显示了我不理解的行为(第一个坐标似乎是唯一影响任何事物的坐标),使我回到我的信念,即我只是未能理解关于 pyglet 的一些非常基本的东西, OpenGL, 甚至一般的 3D :p

相关代码如下:

import pyglet
from pyglet.gl import *

window = pyglet.window.Window()

positionBufferObject = GLuint()
vao = GLuint()

vertexPositions = [0.0, 0.0, 0.0,
0.25, 0.0, 0.0,
1.75, 1.75, 0.0]

vertexPositionsGl = (GLfloat * len(vertexPositions))(*vertexPositions)

@window.event
def on_draw():
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0)
glDrawArrays(GL_POINTS, 0, 3)
glDisableVertexAttribArray(0)

glGenBuffers(1, positionBufferObject)
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject)
glBufferData(GL_ARRAY_BUFFER, len(vertexPositionsGl)*4, vertexPositionsGl, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, 0)

glClearColor(0.0, 0.0, 0.0, 0.0)
pyglet.app.run()

最佳答案

glDrawArrays(GL_POINTS, 0, 1)

指示绘制1点,在你的教程中,1是3:

glDrawArrays(GL_POINTS, 0, 3)

另请注意,顶点的第 4 个 (w) 分量应为 1,而不是 0:

  vertexPositions = [0.0, 0.0, 0.0, 1.0,
0.25, 0.0, 0.0, 1.0,
1.75, 1.75, 0.0, 1.0]

或者,您可以删除 w 组件,

  vertexPositions = [0.0, 0.0, 0.0,
0.25, 0.0, 0.0,
1.75, 1.75, 0.0]

并将以下调用更改为:

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

另一件事,我不是 pyglet 方面的专家,但 glBufferData 可能像它的 C 对应物一样,采用字节大小,而不是元素大小。每个 float 都是 4 个字节,你可以试试:

glBufferData(GL_ARRAY_BUFFER, len(vertexPositionsGl)*4, vertexPositionsGl, GL_STATIC_DRAW)

关于python - 基本的 openGL、顶点缓冲区和 pyglet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4618892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com