- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
编辑: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/
我正在使用Python 2.6.6和pyglet 1.1.4。在我的“Erosion”文件夹中,有“Erosion.py”和一个名为“Images”的文件夹。在图像内部,有.png图像。一幅图像被命名
我有一个奇怪的问题。当 pyglet 应用程序启动时,它只绘制 1-2 帧然后卡住。 on_draw 事件刚刚停止发生。但是每次我移动鼠标或按键时,on_draw 事件也会调度。简而言之,我必须移动鼠
我有一个应用程序正在创建名为 Pizza Clicker 的 Cookie Clicker 的替代版本。它非常基本,但运行速度非常慢,我不明白为什么。 import pyglet window = p
因此,在我们的游戏中使用 Tkinter 后,我们决定转向 Pyglet。但我遇到的问题之一是运动,在 Tkinter 中我能够制作一个平滑的运动系统,但在 pyglet 中我所能做的就是让角色以一种
我正在使用 pyglet 的 Player 类在 python 中编写一个音频播放器。该模块只是对 Player 和 Source 类的测试,它不会产生任何结果。没有声音,没有错误,只有一个关于垂直同
我正在尝试使用 pyglet 制作一个简单的 GUI。 这是我的代码: button_texture = pyglet.image.load('button.png') button = pyglet
考虑以下示例: import pyglet def foo(): print("I'm in a loop...") def main(): w = pyglet.window.Win
我正在使用 pyglet (OpenGL) 库,我希望能够在不改变窗口大小的情况下改变虚拟分辨率。例如,一个 2x2 的框将在屏幕上绘制为 4x4 像素。我知道我可以找到正在绘制的所有内容并单独对其进
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我非常喜欢 pyglet,但是抽象的基本单位是坐标向量,这很笨拙,而且不是我在设计复杂场景时想要的抽象级别。 是否有任何库“通常”与 pyglet 一起使用来管理形状并将它们组合到场景中?每个人都从头
我有一个用于在屏幕上显示文本的标签元素: nameLabel = pyglet.text.Label(name, font_name='Tahoma', x=50, y=50, font_size=1
我正在使用 pyglet 编写心理物理学实验。我使用的电脑有两个显示器。它们被配置为两个独立的 Xscreens,0 和 1,分别对应于我的工作站监视器和实验屏幕。我想让 pyglet 绘制到实验屏幕
在我使用 Python 和 pyglet 的游戏中,我有将事件向下传播到其成员的组: class Group(EventDispatcher): def __init__(self):
我制作了两个立方体视口(viewport),但它们都是正面正交投影,我需要其中一个来自侧面。这是绘图代码draw_small 正在绘制小型静态立方体dwar_big是大立方体的绘制,可以移动、缩放和旋
我目前正在开发一个项目,我一直在尝试将 pyglet 库中的标签字体更改为我在网上找到的字体,但我无法让它工作。我尝试在网上搜索一个小时,但似乎没有任何效果。添加了一些代码供引用: font.add_
所以我是一名 Python 初学者程序员,我一直在使用 pyglet,如果您运行此代码,我发现了一个问题: from pyglet.gl import * window = pyglet.window
我已经阅读了我能找到的所有内容,并查看了 pyglet 上游戏循环的许多示例,但我仍然不确定它是如何工作的或到底发生了什么。 (这些是我读过的文章...) http://www.pyglet.org/
我正在使用 Pyglet,并且我有一个包含在背景上移动的对象的小东西。它们都由图像(png 和 jpg)表示。 我创建了一个大小为 800x600 的非全屏窗口,它工作正常,但是当我切换到全屏时...
好吧,所以我对 pyglet 和 OpenGL 来说都是个新手,我想知道为什么这不起作用: def DrawCircle(cx, cy, r, segments): theta = 2*3.14159
我正在尝试使用 Pyglet 通过 OpenGL 渲染图像。到目前为止,我已经能够设置帧缓冲区和纹理、渲染到其中并将其保存为 PNG 图像。但我不知道如何使用 Pyglets 字体渲染。 import
我是一名优秀的程序员,十分优秀!