gpt4 book ai didi

python - 使用 pygame 进行主动纹理化(可能?要研究哪些概念?)

转载 作者:太空狗 更新时间:2023-10-29 22:14:20 25 4
gpt4 key购买 nike

我有两张图片:

Mask Texture

我想从本质上“切掉”纹理图 block 中的黑色形状,这样我最终得到的结果如下:

Cutout

除了形状周围是透明的。这可能使用pygame吗?这个例子我必须在 GIMP 中创建。

此外,在实时环境中对几个 Sprite 的每一帧都执行此操作会不会太注重性能? (每秒 30 多帧)

最佳答案

我做了一个解决方案,但是无论是速度还是美观,它都不是最好的。您可以使用双 blitting 设置颜色键以实现透明度。这样,面具应该只有两种颜色:黑色和白色。请注意,您不能将此用于仅适用于 RGB 图像的每像素 alpha (RGBA) 图像。其他限制是建议纹理和蒙版图像的大小相同(如果不是,则应使用区域进行 blitting)。

一句话,一步一步:

  • 用蒙版创建一个表面。背景应为白色 (255,255,255), mask 部分应为黑色 (0,0,0)
  • 创建纹理或将纹理加载到表面
  • 为黑色蒙版设置透明度色键
  • 将蒙版 blit 到纹理上(或复制到纹理上)。此时蒙版的黑色部分还没有 blit 到纹理,因为我们使用 set_colorkey 方法将黑色设置为透明
  • 现在将纹理(或纹理的副本)的色键设置为白色。请记住,我们当前的纹理表面有白色和纹理部分。
  • 将纹理blit到屏幕。由于我们已经使用 colorkey 将其设置为透明,因此白色部分不会被 blited

代码示例:

#!/usr/bin/python
# -*- coding:utf8 -*-

import pygame, sys

#init pygame
pygame.init()

#init screen
screen=pygame.display.set_mode((800,600))
screen.fill((255,0,255))

#loading the images
texture=pygame.image.load("texture.jpg").convert()
texture_rect=texture.get_rect()
texture_rect.center=(200,300)
mask=pygame.Surface((texture_rect.width,texture_rect.height)) # mask should have only 2 colors: black and white
mask.fill((255,255,255))
pygame.draw.circle(mask,(0,0,0),(texture_rect.width/2,texture_rect.height/2),int(texture_rect.width*0.3))
mask_rect=mask.get_rect()
mask_rect.center=(600,300)

tmp_image=texture.copy() # make a copy of the texture to keep it unchanged for future usage
mask.set_colorkey((0,0,0)) # we want the black colored parts of the mask to be transparent
tmp_image.blit(mask,(0,0)) # blit the mask to the texture. the black parts are transparent so we see the pixels of the texture there

tmp_rect=tmp_image.get_rect()
tmp_rect.center=(400,300)
tmp_image.set_colorkey((255,255,255))
screen.blit(texture,texture_rect)
screen.blit(mask,mask_rect)
screen.blit(tmp_image,tmp_rect)

pygame.display.flip()

while 1:
event=pygame.event.wait()
if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in [pygame.K_ESCAPE, pygame.K_q]):
sys.exit()

我建议不要使用 jpg 作为掩码,因为它是有损格式,我建议使用 bmp 或 png(bmp 更好)。请记住,它不使用 alpha,所以边缘不会被消除锯齿,所以在 2010 年这不是一个好的解决方案 :)

结果截图如下: masked blitting

编辑:再次嗨,

我用 BLEND_ADD 进行了一些测试,结果很有希望。这是代码:

import pygame, sys

#init pygame
pygame.init()

#init screen
screen=pygame.display.set_mode((800,600))
screen.fill((255,0,255))

#loading the images
texture=pygame.image.load("texture.jpg").convert_alpha()
texture_rect=texture.get_rect()
texture_rect.center=(200,300)
mask=pygame.image.load("mask2.png").convert_alpha()
mask_rect=mask.get_rect()
mask_rect.center=(600,300)

textured_mask=mask.copy()
textured_rect=textured_mask.get_rect()
textured_rect.center=400,300

textured_mask.blit(texture,(0,0),None,pygame.BLEND_ADD)

screen.blit(texture,texture_rect)
screen.blit(mask,mask_rect)
screen.blit(textured_mask,textured_rect)

pygame.display.flip()

while 1:
event=pygame.event.wait()
if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key in [pygame.K_ESCAPE, pygame.K_q]):
sys.exit()

结果: result

使用此解决方案,您可以获得每个像素的 alpha 纹理。请注意, mask 应该是带有 alpha channel 的图像,因此不能使用 jpg。最好使用 png。

纹理图像(texture.jpg): texture

mask 图像 (mask2.png): mask

关于python - 使用 pygame 进行主动纹理化(可能?要研究哪些概念?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3580500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com