编辑:rotoglup在我的代码中发现了问题,添加了我删除的着色器完成了解决方案.请参阅下面的答案以获取正确的代码(使用着色器).
大家好 !
我正在尝试从本教程中学习一些现代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()
Run Code Online (Sandbox Code Playgroud) 如果我在 VSCode 终端中运行此代码
import pyglet
window = pyglet.window.Window(500, 500)
Run Code Online (Sandbox Code Playgroud)
我明白了
Traceback (most recent call last):
File "/home/justin/.local/lib/python3.8/site-packages/pyglet/__init__.py", line 334, in __getattr__
return getattr(self._module, name)
AttributeError: 'NoneType' object has no attribute 'Window'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/justin/Dropbox/jr/py/pyglet_games/pyglet_demo/displaytest.py", line 5, in <module>
window = pyglet.window.Window(500, 500)
File "/home/justin/.local/lib/python3.8/site-packages/pyglet/__init__.py", line 340, in __getattr__
__import__(import_name)
File "/home/justin/.local/lib/python3.8/site-packages/pyglet/window/__init__.py", line 1891, in <module>
gl._create_shadow_window()
File "/home/justin/.local/lib/python3.8/site-packages/pyglet/gl/__init__.py", line 220, in _create_shadow_window
_shadow_window = Window(width=1, height=1, visible=False) …Run Code Online (Sandbox Code Playgroud) 我在玩 pyglet 1.2alpha-1 和 Python 3.3。我有以下(非常简单的)应用程序,但无法弄清楚我的问题是什么:
import pyglet
window = pyglet.window.Window()
#image = pyglet.resource.image('img1.jpg')
image = pyglet.image.load('img1.jpg')
label = pyglet.text.Label('Hello, World!!',
font_name='Times New Roman',
font_size=36,
x=window.width//2, y=window.height//2,
anchor_x='center', anchor_y='center')
@window.event
def on_draw():
window.clear()
label.draw()
# image.blit(0,0)
pyglet.app.run()
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,只要将 image.blit(0, 0) 注释掉,我的文本标签就会出现。但是,如果我尝试显示图像,程序会因以下错误而崩溃:
File "C:\Python33\lib\site-packages\pyglet\gl\lib.py", line 105, in errcheck
raise GLException(msg)
pyglet.gl.lib.GLException: b'invalid value'
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用 pyglet.resource.image 而不是 pyglet.image.load (图像和 py 文件在同一目录中),我也会收到上述错误。
有谁知道我该如何解决这个问题?
我使用的是 Python 3.3、pyglet 1.2alpha-1 和 Windows 8。
我花了最近几个星期的时间来看看openGL.虽然我对一些较旧的NeHe示例没有问题,但从我读过的所有内容来看,OpenGL4是一个完全不同的过程.我可以访问红皮书和超级圣经,但前者仍然提供传统的opengl调用,后者使用自己的库.在理解如何将代码放在项目中时,两者都没有特别有用.例如,我目前的理解是glu和glut是遗留的,不应该用于opengl 4.
我可以非常容易地为假设的模型空间生成顶点.我很难理解模型最终会如何出现在我的屏幕上.大约95%的尝试最终都是黑屏.
提前致谢.
这是一些代码:
# primatives.py
from collections import Iterable
from functools import reduce
import operator
import numpy as np
from exc import UnimplementedMethod
class Primative(object):
SIZE = 1 # number of pixels on a default grid
def __init__(self, point=None, *args, **kwargs):
self.point = point if isinstance(point, Iterable) else [0, 0, 0]
self.point = np.array(self.point, dtype=np.float32)
scaler = [self.SIZE/2]*len(self.point)
self.point = (self.point * scaler).tolist()
@property
def active(self):
attr = "__active__"
if not hasattr(self, attr):
setattr(self, attr, False)
return getattr(self, …Run Code Online (Sandbox Code Playgroud) 我想在单独的线程中运行 pyglet,以便我可以实现输入的用户界面,而不会被pyglet.app.run().
import pyglet
class Window(pyglet.window.Window):
def __init__(self):
pyglet.window.Window.__init__(self, visible=True)
self.push_handlers(on_draw=self.on_draw)
self.im = pyglet.resource.image('image.jpg')
pyglet.app.run()
def on_draw(self):
self.clear()
import threading
class Thread(threading.Thread):
def run(self):
w = Window()
Run Code Online (Sandbox Code Playgroud)
跑步
Window()
Run Code Online (Sandbox Code Playgroud)
工作正常。然而,运行
t = Thread()
t.start()
Run Code Online (Sandbox Code Playgroud)
结果为Segmentation fault (core dumped),这是由对 的调用引起的pyglet.resource.image()。省略该调用可以消除该问题。
具体来说,是什么导致了这个问题,我该如何纠正它?更一般地说,使用 pyglet 渲染窗口同时允许其他程序执行的推荐方法是什么?有一个更好的方法吗?
我正在为我的第一个深度 Pyglet 项目开发一种 2D Minecraft 克隆,但我遇到了一个问题。每当我在屏幕上有相当数量的块时,帧速率就会急剧下降。
这是我的渲染方法:我使用字典,键是元组(表示块的坐标),项目是纹理。
我遍历整个字典并渲染每个块:
for key in self.blocks:
self.blocks[key].blit(key[0] * 40 + sx,key[1] * 40+ sy)
Run Code Online (Sandbox Code Playgroud)
PS sx 和 sy 是屏幕滚动的坐标偏移量
我想知道是否有一种方法可以更有效地渲染每个块。
是否有可能使用 pyglet 直接渲染/绘制到图像缓冲区中?
我目前正在从事一个涉及 openai 健身房的项目,该项目使用 pyglet 进行渲染。健身房env公开了一个渲染方法,它返回窗口的 rgb 值。据我了解,pyglet 从打开的窗口中提取此表示。
不幸的是,我的项目涉及一个程序,该程序利用 python 的multiprocessing包来生成包含 openai 健身房实例的子进程env。
由于我的操作系统 (OSX) 禁止来自子进程的 UI 操作,因此当我尝试调用 render 方法以获取 rgb 值时,python 立即崩溃。
I am trying to read and display a .ply file with Trimesh in Python. I have installed Trimesh using pip install trimesh as well as pyglet to display the file.
import trimesh
mesh = trimesh.load("file.ply")
mesh.show()
Run Code Online (Sandbox Code Playgroud)
However, I keep getting the following error when running this code:
GLException: No GL context; create a Window first
Run Code Online (Sandbox Code Playgroud)
Could someone please help me resolve this?
@win.event
def on_key_press(key, modifiers):
if key == pyglet.window.key.UP:
print("UP")
Run Code Online (Sandbox Code Playgroud)
此功能仅打印一次 UP,但我想在按住 UP 按钮的同时打印 UP。
我有一个 USB 控制器,我试图从中获取输入,即 Microsoft\xc2\xae SideWinder\xc2\xae 即插即用游戏手柄。我在尝试弄清楚如何正确接收其输入时遇到困难。不幸的是,我无法使用 pygame,因为它需要一个窗口来接收输入,但我必须生成一个 pyglet 窗口(通过 PsychoPy)来运行我的程序。使用 pygame 它可以连接并显示按钮的状态,但如果不创建窗口就无法接收输入。我尝试寻找其他库,但我遇到的只是输入,它与我的控制器不兼容(安装后未检测到设备)。控制器本身的工作原理与我使用在线游戏手柄测试仪测试的一样。PsychoPy 的操纵杆 API 目前已损坏并且无法工作,因此也没有运气。
\n\n我真的希望有人能就如何将控制器/游戏手柄的输入接收到我的程序提供建议?
\n