【问题标题】:How do you access pySDL2 SoftwareSpriteRenderSystem Blendmode?如何访问 pySDL2 SoftwareSpriteRenderSystem Blendmode?
【发布时间】:2015-02-26 05:49:08
【问题描述】:

问题很简单。我想在 Python 中更改我的 SDL2 渲染器的 Blendmode,但我不知道如何访问渲染器。

PySDL2 Documentation here 声明您可以使用 Alpha 通道定义颜色:

类 sdl2.ext.Renderer

blendmode:用于绘图的混合模式 操作(填充和线条)。这可以是

。 SDL_BLENDMODE_NONE 表示不混合

。 SDL_BLENDMODE_BLEND 用于 Alpha 混合

。 SDL_BLENDMODE_ADD 用于加色混合

。 SDL_BLENDMODE_MOD 用于多重颜色混合

我只需将 Blendmode 设置为 SDL_BLENDMODE_BLEND 以便我可以使用 Alpha 通道。我的问题是我正在使用 SoftwareSpriteRenderSystem

self.Renderer = self.SpriteFactory.create_sprite_render_system(self.Window)

这里没有任何明确的方法可以更改混合模式。我可以尝试执行以下操作:

SDL_SetRenderDrawBlendMode(self.Renderer,SDL_BLENDMODE_BLEND)

但这会返回:

ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_SDL_Renderer instance instead of SoftwareSpriteRenderSystem

有人可以帮帮我吗?我只是希望能够获得一些透明的 Sprites(from_rect sprites),但事实证明这很困难,因为 SDL_renderer 无法访问。

【问题讨论】:

  • 您的问题含糊不清。您想要包含 Alpha 通道的精灵还是想要混合基本的绘制和填充操作?
  • @Marcus 我想要包含 Alpha 通道的精灵。我使用 'from_color' 来创建我的基本形状(不是 from_rect 我不好),所以无论你为精灵设置透明度是我所需要的。

标签: python sdl-2 renderer pysdl2


【解决方案1】:

由于您需要或想要包含 Alpha 通道的纯色精灵,因此只有在您实际在屏幕上渲染内容并且在创建纹理时不相关时,混合才会相关。

仅当您不使用基于软件的渲染时,才支持您最初问题中的混合标志。这意味着您不能使用提供SoftwareSpriteRenderSystemSpriteFactory,而是使用带有TEXTURE sprite 类型的SpriteFactory

为窗口创建基于纹理的渲染器和工厂的简短示例:

window = sdl2.ext.Window("Test", size=(800,600))
renderer = sdl2.ext.Renderer(window)
#     use renderer.blendmode = ... to change the blend mode
factory = sdl2.ext.SpriteFactory(sdl2.ext.TEXTURE, renderer=renderer)
rsystem = factory.create_sprite_render_system(window)

请注意,您将收到来自SpriteFactoryTextureSprite 对象,这不允许 您可以像 SoftwareSpriteSDL_Surface 对象一样访问像素。

要创建带有 Alpha 通道的 TextureSprite,请确保在 factory.from_color() 调用中使用 32 bpp 和 Alpha 掩码。

# Create a solid, quadratic, red texture of 100px in size, using a RGBA color layout.
factory.from_color(0xFF000000, size=(100, 100),
                   masks=(0xFF000000,           # red channel
                          0x00FF0000,           # green channel
                          0x0000FF00,           # blue channel
                          0x000000FF))          # alpha channel

【讨论】:

  • 所以我需要使用TextureSprites来创建透明度?我的 GUI 中只有软件精灵。如果我使用 SoftwareSpriteRenderSystem 渲染我的精灵,我该如何渲染?
  • 不,您只需要它们,如果您想使用 SDL 渲染器的内置混合功能。您也可以使用上面的 from_color() 调用获得软件精灵的 alpha 透明度。
  • 好的,谢谢。我以前没有使用口罩。这就是解决方案。现在我可以修改 alpha 通道以获得结果。惊人的。但是,您似乎无法使窗口本身透明。总会有一个代表窗口大小的黑框。可以理解的限制。
猜你喜欢
  • 1970-01-01
  • 2015-07-24
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多