[英]libGDX set color in sprite to transparent
我正在將精靈從精靈表繪制到屏幕上。 子畫面具有黑色背景。 我希望將黑色(只有黑色)渲染為透明(如果可能)。 所以,說我有一個紅色背景。 然后,我有一個帶有藍色圓圈和黑色背景的精靈。 當我將其繪制到屏幕上時,我只希望看到藍色圓圈(顯然還有紅色背景)。 這是我當前項目的代碼。 幫助極大的贊賞!
public void render(float delta) {
Gdx.gl.glClearColor(1f, 1f, 1f, 1f);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
batch.enableBlending();
camera.update();
generalUpdate();
batch.begin();
// Rendering Code
Assets.sprite_moon.draw(batch);
if (Assets.accelerated) {
Assets.sprite_flame.draw(batch);
}
Assets.sprite_rocket.draw(batch);
Assets.sprite_blue.draw(batch);
// End render code
batch.end();
batch.disableBlending();
}
您正在尋找“色度鍵”或“色鍵”支持(並且您希望黑色成為您的“色度色”)。 通常,libgdx不支持此功能。 請參見卸下Sprites顏色鍵libGDX
但是,大多數工具(和Libgdx)都支持“ alpha通道”,這是一種指定任何像素的透明度而不依賴其顏色的方式。 生成圖像甚至將圖像打包到Spritesheet中時,您都應該能夠設置透明度。 或者,您可以自己在圖像上建立預處理通道。 請參閱如何告訴libgdx使用特定顏色的透明度?
如果您真的想使用色度鍵方法,可以嘗試使用自定義着色器,但是除非您有充分的理由使用着色器,否則我會避免使用該方法。
我知道這很舊,但是出於優先考慮,如果沒人要下載GIMP,我使用這個免費網站將我的精靈變成透明的png:
我在python3中編寫了以下腳本,以使用帶有Alpha通道的PNG替換一堆具有顏色鍵透明度的圖像。 隨意使用它,就像這樣調用它:process_image(“ a.bmp”,“ a.png”)
它需要scipy和numpy,您可以使用pip3進行安裝。
#!/usr/bin/env python3
from scipy import misc
import numpy as np
def process_image(filepath, outfile):
image = misc.imread(filepath)
if image.shape[2] == 3:
alpha = np.expand_dims(np.full(image.shape[:2], 255), axis=2)
image = np.append(image, alpha, axis=2)
width, height = image.shape[1], image.shape[0]
color_key = image[0,0,:3]
for x in range(width):
for y in range(height):
pixel = image[y,x,:3]
if np.array_equal(pixel, color_key):
image[y,x,3] = 0
misc.imsave(outfile, image)
這是我用來使顏色透明的一些代碼。 在這種情況下,我從Blender渲染輸出中獲得了一系列關鍵幀,這些關鍵幀使用全綠色作為色鍵,即。 綠色屏幕。
import pygame
OUTPUT_FN = 'spritesheet.png'
SPRITE_SIZE = 256
COLUMNS = 4
ROWS = 4
TRANSP_COLOR = (0,255,0)
screen_size = ((SPRITE_SIZE * COLUMNS, SPRITE_SIZE * COLUMNS))
screen = pygame.display.set_mode(screen_size)
x, y = 0, 0
column, row = 0,0
sheet = pygame.Surface(screen_size)
for i in range(1,25):
if i < 10:
fn = "%s%i.png" % ("000", i)
else:
fn = "%s%i.png" % ("00", i)
keyframe = pygame.image.load(fn)
keyframe.set_colorkey(TRANSP_COLOR)
x = column * SPRITE_SIZE
y = row * SPRITE_SIZE
sheet.blit(keyframe, (x,y))
if column + 1 == COLUMNS:
column = 0
row += 1
else:
column += 1
running = True
while running:
pygame.display.update()
screen.blit(sheet, (0,0))
for e in pygame.event.get():
if e.type == pygame.QUIT:
running = False
if e.type == pygame.KEYDOWN:
kname = pygame.key.name(e.key)
if kname == 'q':
running = False
if kname == 's':
pygame.image.save(screen, OUTPUT_FN)
pygame.quit()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.