【发布时间】:2011-01-06 19:24:19
【问题描述】:
编辑: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()
【问题讨论】:
-
你的意思是用更正的代码,你仍然有一个单点绘制?这个点是画在屏幕中间的吗?如果你改变第一个坐标,点会移动吗?
-
使用更正后的代码,我得到的最好的仍然是一个单点,它不会随着 w 坐标为 1 移动并以字节为单位传递大小。如果我删除 w 坐标并相应地更改 glVertexAttribPointer,我什么也得不到。我彻底糊涂了!
-
更正:w 必须为 0 才能显示某些内容,这只会让我更加困惑。
-
这可能与在您不知情的情况下发生的一些剪辑有关。由于您没有设置任何投影或变换矩阵,因此您的第三点肯定在屏幕外。由于 Z 值,其他的也可能被剪裁。不过,我没有考虑默认的 opengl 投影。您应该尝试调用 glOrtho 来安装投影。您还应该尝试绘制一个三角形,如果某些点在无限远或屏幕外,它会使图形更加明显。