标签: pyglet

基本的openGL,顶点缓冲区和pyglet

编辑: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)

python opengl pyglet

6
推荐指数
2
解决办法
4855
查看次数

pyglet.canvas.xlib.NoSuchDisplayException:无法连接到“None”仅发生在 VSCode 终端中

如果我在 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 visual-studio-code

6
推荐指数
1
解决办法
1万
查看次数

使用 Pyglet 加载图像

我在玩 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 pyglet image-loading python-3.x

5
推荐指数
1
解决办法
2800
查看次数

向我解释,就像我5:OpenGL 4.x渲染管道

我花了最近几个星期的时间来看看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)

python rendering pipeline pyglet opengl-4

5
推荐指数
1
解决办法
529
查看次数

pyglet可以在新线程中运行吗?

我想在单独的线程中运行 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 渲染窗口同时允许其他程序执行的推荐方法是什么?有一个更好的方法吗?

python multithreading pyglet python-2.7

5
推荐指数
0
解决办法
2275
查看次数

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 是屏幕滚动的坐标偏移量

我想知道是否有一种方法可以更有效地渲染每个块。

python graphics rendering pyglet

5
推荐指数
1
解决办法
3148
查看次数

在不打开窗口的情况下渲染到图像缓冲区

是否有可能使用 pyglet 直接渲染/绘制到图像缓冲区中?

背景:

我目前正在从事一个涉及 openai 健身房的项目,该项目使用 pyglet 进行渲染。健身房env公开了一个渲染方法,它返回窗口的 rgb 值。据我了解,pyglet 从打开的窗口中提取此表示。

不幸的是,我的项目涉及一个程序,该程序利用 python 的multiprocessing包来生成包含 openai 健身房实例的子进程env

由于我的操作系统 (OSX) 禁止来自子进程的 UI 操作,因此当我尝试调用 render 方法以获取 rgb 值时,python 立即崩溃。

pyglet

5
推荐指数
0
解决办法
378
查看次数

GLException: No GL context; create a Window first

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?

python pyglet trimesh

5
推荐指数
0
解决办法
1133
查看次数

在 Python pyglet 中按下按钮时执行某些操作

@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。

python pyglet

5
推荐指数
1
解决办法
2596
查看次数

如何让 USB 控制器/游戏手柄与 python 一起工作

我有一个 USB 控制器,我试图从中获取输入,即 Microsoft\xc2\xae SideWinder\xc2\xae 即插即用游戏手柄。我在尝试弄清楚如何正确接收其输入时遇到困难。不幸的是,我无法使用 pygame,因为它需要一个窗口来接收输入,但我必须生成一个 pyglet 窗口(通过 PsychoPy)来运行我的程序。使用 pygame 它可以连接并显示按钮的状态,但如果不创建窗口就无法接收输入。我尝试寻找其他库,但我遇到的只是输入,它与我的控制器不兼容(安装后未检测到设备)。控制器本身的工作原理与我使用在线游戏手柄测试仪测试的一样。PsychoPy 的操纵杆 API 目前已损坏并且无法工作,因此也没有运气。

\n\n

我真的希望有人能就如何将控制器/游戏手柄的输入接收到我的程序提供建议?

\n

python windows pygame pyglet psychopy

5
推荐指数
1
解决办法
1万
查看次数