電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
用Shader的實作模擬色盤

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫
上一篇主題 :: 下一篇主題  
發表人 內容
waffenss
偶而上來逛逛的過客


註冊時間: 2008-10-17
文章: 8

14.39 果凍幣

發表發表於: 2008-10-17, PM 5:53 星期五    文章主題: 用Shader的實作模擬色盤 引言回覆

我現在有用shader來寫一些基本繪圖效果.
例如Parallax Normal Mapping.

不過這次丟上來的是模擬色盤的shader.
現在的GPU已經不直接支援色盤了.
色盤的好處是可以一直換顏色卻不太耗貼圖容量.
之前遇到一種情形是,很多介面大圖, 切換一次流程就要換一次顏色
如果換了5次,就是五倍圖量.
但是這些介面和底圖其實形狀和明度是不變的.
所以最後想出這個做法.

後來看到Halo3也是用類似做法來最佳化武器火光的貼圖.
它其實大部份火光是同一套灰階貼圖,靠模擬色盤來變換顏色.

[Vertex Shader]
varying vec2 vUV;
void main(void)
{
gl_Position = ftransform();
vUV.x = gl_MultiTexCoord0.x;
vUV.y = -gl_MultiTexCoord0.y;
} //以上只是做頂點座標變幻和貼圖座標輸出而已,沒什麼特別.

[Fragment Shader]
uniform sampler2D idx; //一張512X512灰階的圖.
uniform sampler2D pal; //一張256X1的彩色漸層圖
varying vec2 vUV;
void main(void)
{
float index = texture2D(idx,vUV).y;
//從灰階圖的綠色頻道取得明暗度當做色盤的索引index

vec2 newUV = vec2(1.0-index , 0.5);
//因為我色盤明暗做反了,所以1-index
//newUV.y可是任意值. 隨便給它0.5.
//newUV是新的貼圖座標, 等一下用它來讀色盤

// newUV.x = clamp(newUV.x , 0.1 , 0.9);
vec4 color = texture2D(pal,newUV);
//讀色盤

gl_FragColor = vec4(color.xyz, 1.0);
//回傳
}

我們只要做很多組256X1的彩色漸層圖
(256x1相當於8bit調色盤,你也可以8X1~128x1,如果不需很多顏色)
就可以一直換顏色.色盤只有256pixel所以很小,
更棒的是色盤是可以共用的,所以簡直不耗容量.
因為讀2次貼圖, 所以會稍微多耗一點效能.
回頂端
檢視會員個人資料 發送私人訊息
Percy
偶而上來逛逛的過客


註冊時間: 2008-10-12
文章: 14

0.00 果凍幣

發表發表於: 2008-10-18, AM 9:22 星期六    文章主題: 引言回覆

這個shader會應用在甚麼地方?

我補上Halo3 的特效介紹
http://www.microsoft.com/downloads/details.aspx?FamilyId=D9AE7757-64D9-489E-AEA3-A54F39A66B37&displaylang=en

_________________
開發日誌
http://koetap.mysinablog.com/
回頂端
檢視會員個人資料 發送私人訊息
vamper
對這略感興趣的新人


註冊時間: 2007-06-23
文章: 29
來自: 台灣
18.82 果凍幣

發表發表於: 2008-10-19, PM 9:45 星期日    文章主題: 引言回覆

喔!看到有人談論shader呀~

這想法滿不錯的,是屬於color control的技術之一。

其實不只在UI中,在我們遊戲中的場景或怪物,

他們的外觀不保持不變,但是要讓玩家知道,這個怪物是不同等級的,

或者說同樣的場景,但是色調要不一樣,比如:金木水火土的色系。

那我們必須要用顏色來表示。

為了節省一些資源,在shader的幫助下可以讓我們來解決上面的問題,

只是消耗顯示卡的一點點運算(per-pixel或per-vertex),來節省一些記憶體。

至於演算法如何?就看個人的作法~頂樓的版友就是其中一個作法。

而且也給美術人員一個相當好的幫助與支援。

This's good!
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
waffenss
偶而上來逛逛的過客


註冊時間: 2008-10-17
文章: 8

14.39 果凍幣

發表發表於: 2008-10-20, AM 2:22 星期一    文章主題: Re: 用Shader的實作模擬色盤 引言回覆

只要是圖形類似但色相不同的貼圖,都能用色盤換色.

怪物的貼圖換色,天空貼圖換色,特效貼圖換色.....都可以.
甚至2D字型如果有辦法用shader,也可以做換色.

Halo3這種場景大貼圖多的遊戲容易繪圖記憶體不足.所以也用色盤來最佳化.

另外這種2pass的貼圖讀取的做法, 只要把第一張1D 貼圖換成大色塊的明暗色,
然後用即時光照的強度值(0~1)當做index去查找.
就可以簡單做出卡通算圖的色塊感.
算是蠻簡單好用又不太耗效能的做法

我本來是想做即時色相變化,但是那難度太高.
我又不是程式設計師, 實在寫不出color space conversion的即時換色.
還是模擬色盤簡單多了,
回頂端
檢視會員個人資料 發送私人訊息
Percy
偶而上來逛逛的過客


註冊時間: 2008-10-12
文章: 14

0.00 果凍幣

發表發表於: 2008-10-20, AM 10:05 星期一    文章主題: 引言回覆

我也有使用色盤
不過是用在調整渲染效果
用在皮膚上尤其有效

_________________
開發日誌
http://koetap.mysinablog.com/
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式高級班:DirectX、OpenGL及各種圖型函式庫 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作