2013-09-01 45 views
2

在我的基於2D平鋪的遊戲中,玩家可以在平鋪時改變顏色。簡單的方法(以及我已經完成的)是使用SpriteBatch.Draw中的tint參數。不要着色,但「着色」精靈

這看起來不錯,而且這裏有一個例子:

enter image description here

但是說,我要畫的木白。如果你曾經與色調混淆,你知道這是不可能的使用色調參數。 Color.White會將sprite設爲默認顏色,而不是白色。這不是一個主要問題,但我想有些用戶可能需要它。

我的問題是,有沒有一種基於色調/飽和度而不是色調的精靈顏色的方法。類似於GIMP中的「colorify」功能。

http://gyazo.com/eaa8d54d82a15ce05b006b084e71803f.png

一個顯而易見的方法是使用在GIMP這個功能,只是出口的精靈爲每種顏色。麻煩在於,這對我所有的精靈來說都是永遠的事情,每個精靈都有多種變化,這意味着你可以在一個模塊類型中總共使用100個以上的組合。

這可能嗎?我想着色器可能會完成這項工作。

+4

爲什麼不讓基礎精靈儘可能明亮(接近白色)?你可以用像素着色器實現任意效果,但我懷疑在這種情況下這是必要的。在我看來,Gimp使用與tint參數相同的技術。 –

+0

研究HSV顏色模型:[鏈接](http://en.wikipedia.org/wiki/HSL_and_HSV)。您可以將您的紋理從RGB轉換爲HSV,將偏移應用於Hue以更改顏色,然後將其轉換回RGB。雖然如果你的紋理以白色開始,並且使用內置的XNA着色,它絕對會更容易。 – foolmoron

回答

4

GIMP中的「colourify」函數簡單地進行去飽和(轉換爲灰度),然後進行顏色乘法。很簡單。這應該是等同的HLSL(未經測試):

float4 original = tex2d(...); 
float q = (original.r + original.g + original.b)/3; 
q /= original.a; // optional - undo alpha premultiplication 
return float4(tint.rgb * q, tint.a * original.a); 

但是你可以通過簡單地存儲所有紋理去飽和開始與和使用默認SpriteBatch着色器的乘法達到同樣的效果。如果您不想修改源文件,可以在自定義內容處理器中進行。


儘管如此,如果你想使用自定義着色器,你可以做一些更復雜。你可以實現完整的色調旋轉(有點複雜)。但也許你可以考慮像"Overlay" blend mode(非常簡單) - 它可以讓灰色着色,同時保留高光和低光(而不是乘法,這也會使高光成色)。

+0

當在同一像素上反覆使用此公式並將結果存儲在該像素中時,像素會變得越來越暗。有關如何避免這種情況的建議? – jjxtra

+0

@PsychoDad如果你沒有在alpha乘法前做一些奇怪的事情,那麼這可能是一個精確丟失問題。浮點數學很少給出確切的結果,微小的錯誤最終會加上一個很大的錯誤。簡單的答案是:「不要那樣做」。如果它仍然引起你的問題,也許提出一個新的問題將全部細節(也許在GameDev網站)。 –

1

要繼續使用SPriteBatch.Draw中的色調。只要讓你的「可繪畫」紋理灰度。所以白色的木頭會成爲你的默認材質,但是你可以用色彩來畫它,使它變成木色。

我經常用這個做UI和團隊着色:)

的情況下,有趣的是,什麼色調不只是乘以每個像素紋理由你選擇的顏色。

例如:
紋理像素(RGBA)[1.0,0.5,0.5,1.0]
色調爲[1.0,0.5,0.5,0.5]
結果爲[1.0,0.25,0.25,0.5](半透明和更紅的ish)

+0

這樣做的問題是,假設我有一個塊,不能僅將棕色色調應用爲默認值,即具有多種顏色的塊。我可能只是抓住texture2d數據,並將其作爲灰度級數據複製到新的數據。 – Cyral

+0

@CYral如果出現這種情況,我可能會考慮使用Paint(Color tintColor)方法,該方法獲得了原始紋理的灰度版本並對其進行了着色(使用rendertarget很容易)。 –