【问题标题】:Pyglet ignores alpha channelPyglet 忽略 alpha 通道
【发布时间】:2020-04-01 22:47:06
【问题描述】:

我正在尝试为我使用 Pyglet 用 Python 编写的游戏制作关卡编辑器。我希望能够修改我放置的任何方块的黑暗度。因此,我在Block 类中添加了darkness 属性。这是那个类:

class Block:
    def __init__(self, name, image, wall):
        self.name = name
        self.image = image
        self.wall = wall
        self.darkness = 0

    def set_darkness(self, darkness):
        self.darkness = darkness

    def draw(self, x, y):
        self.image.blit(x, y)
        pyglet.graphics.draw(4, GL_QUADS, ('v2i', (x, y, x + block_width, y, x + block_width, y + block_height, x, y + block_width)), ('c4B', (0, 0, 0, self.darkness) * 4))

我试图通过在图像顶部绘制一个黑色矩形来使图像变暗,然后调整该矩形的透明度。然而,无论我在__init__ 中将self.darkness 设置为什么,矩形仍然是完全不透明的。 我尝试通过将此代码添加到我的程序顶部来启用与 pyglet.gl 的颜色混合:

from pyglet.gl import *
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

这并没有改变。我还尝试使用 Pyglet 的 SolidColorImagePattern 类创建一个黑色矩形,并将 alpha 通道设置为 self.darkness,但这也没有用。如何使这个矩形透明?

【问题讨论】:

  • 你在哪里打电话给glEnable(GL_BLEND) ...?在申请开始时或draw()?

标签: python graphics pyglet


【解决方案1】:

对于任何 OpenGL 指令,都需要有效且当前的OpenGL Context。当然pyglet 提供了一个 OpenGL 上下文,但是在创建 pyglet (OpenGL) 窗口时会创建上下文并使其成为当前的(请参阅pyglet.window)。

先创建窗口,再设置Blending解决问题:

from pyglet.gl import *

window = pyglet.window.Window(400, 400, "OpenGL window")

glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 2019-03-27
    • 1970-01-01
    • 2017-10-02
    • 2011-10-12
    • 2012-06-23
    • 1970-01-01
    • 2022-11-07
    • 2020-09-24
    相关资源
    最近更新 更多