0

如果我以部分透明的颜色在表面(带有 SRCALPHA 标志)上绘制任何形状,它会完全替换其下方的内容,而不是像您在图像编辑器中所期望的那样重叠。

如何使形状正确重叠?

4

3 回答 3

1

您可以使用具有适当值的blitBLEND_*(将形状保持为单独的表面,以实现完整性和编辑,并且仅出于显示目的对它们进行 blit)。

于 2009-12-12T20:26:36.850 回答
1

如前所述,PyGame 中的绘图函数实际上并没有按照您期望的方式进行混合。来自 PyGame 文档:

大多数参数都接受一个颜色参数,它是一个 RGB 三元组。这些也可以接受 RGBA 四元组。如果 alpha 值包含像素 alpha,则 alpha 值将直接写入 Surface,但绘制函数不会透明绘制。

您可能想要做的基本上就是 Alex Martelli 所说的 - 创建一个带有 Alpha 通道的中间软件表面,将您的形状绘制到该表面上,然后在最终表面上进行混合。如果您使用过 PyGame 的字体渲染,请注意它的工作原理大致相同,只是 Font.render 为您创建了临时表面。

这些天我对 Python 和 PyGame 有点生疏了,但这里有一个简单的例子,希望不会有太多错误:

# returns a surface with the circle drawn onto it
def render_transparent_circle(color, radius, width=0):
    size = radius * 2
    temp_surf = pygame.Surface((size, size), SRCALPHA)
    temp_surf.fill(Color(0, 0, 0, 0))
    pygame.draw.circle(temp_surf, color, (radius, radius), radius, width)
    return temp_surf

# draw a half-opaque blue circle of radius 30 to the display at point (50, 100)
def test():
    transp_blue = Color(0, 0, 255, 128)
    screen = pygame.display.get_surface()
    circle = render_transparent_circle(transp_blue, 30)
    screen.blit(circle, (50, 100))

ps -- 如果您要多次显示相同的形状,您可能需要考虑缓存中间表面(但不要忘记分析以了解它是否有帮助)。

于 2009-12-14T15:46:35.357 回答
0

Alpha 本身只是一个可以服务于目的的额外“价值”。碰巧目的通常是(但不总是)透明度(其他用途包括反射、镜面高光,甚至是伪造 HDR 的方法)。

您需要指定您希望它混合(以及它应该使用的方程式)。一个简单的谷歌搜索“pygame blend mode”显示了一些很好的资源。

正如 Alex 所指出的,blit 将混合模式作为参数。这个StackOverflow问题提供了更多信息。

于 2009-12-13T05:41:54.883 回答