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

Google
[請益] 請問關於 Ogre 材質 透明色 設定

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式進階班:各種進階圖型引擎或遊戲引擎
上一篇主題 :: 下一篇主題  
發表人 內容
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-2-23, PM 4:06 星期一    文章主題: [請益] 請問關於 Ogre 材質 透明色 設定 引言回覆

大家好 我又來發問了 這次是關於 材質 的 透明色 設定問題

也就是小弟希望指定一個 ColourKey 讓圖片中和 ColourKey 一樣的像素 顯示為透明

而我是參考這篇文章 修改的 : http://0rz.tw/FBjS8

附帶一提 我使用的Ogre版本為 1.49 而下面則是我的原始碼 :

-----

/*這邊是執行透明化運算的 Function*/

Ogre::String loadChromaKeyedTexture(const Ogre::String& filename,
const Ogre::ColourValue& keyCol,
const Ogre::String& resGroup = Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
const Ogre::String& prefix = "ck_" ,
int numMipmaps = Ogre::MIP_DEFAULT ,
float threshold = 0.003f )
{
using namespace Ogre;
using std::fabs;
Image chromaKeyedImg;
Image srcImg;

srcImg.load (filename, resGroup);
uint width = srcImg.getWidth (), height = srcImg.getHeight ();
uchar* pixelData = srcImg.getData();

Ogre::uint32* pBuf = new Ogre::uint32[width*height];

for(uint y = 0; y < height; ++y)
{
for(uint x = 0; x < width; ++x)
{
ColourValue pixCol = srcImg.getColourAt (x, y, 0);

if( pixCol.r==keyCol.r &&
pixCol.g==keyCol.g &&
pixCol.b==keyCol.b ) pixCol.a=0.5;

Ogre::PixelUtil::packColour (pixCol,
PF_A8R8G8B8, &pBuf[y*width+x] );
}
}

chromaKeyedImg.loadDynamicImage ( (Ogre::uchar*)pBuf,
width, height, 1, PF_A8R8G8B8, true);

String resName = prefix + filename;

TextureManager::getSingleton ().
loadImage( resName , resGroup,
chromaKeyedImg, TEX_TYPE_2D, numMipmaps );

return resName;
}


/*再來是做一個 Rectangle 用來把圖片貼上去*/
Ogre::Rectangle2D *miniScreen;
miniScreen = new Ogre::Rectangle2D(true);
miniScreen->setCorners(0.25, 0.5, 1.0, -1.0);
AxisAlignedBox aabInf;
aabInf.setInfinite();
miniScreen->setBoundingBox(aabInf);
miniScreen->setRenderQueueGroup(RENDER_QUEUE_OVERLAY-1);

miniScreenNode = mSceneMgr->getRootSceneNode()
->createChildSceneNode("MiniScreenNode");

miniScreenNode->attachObject(miniScreen);

/*最後則是呼叫執行透明化的 Function 絕大部分跟連結內的範例一樣*/
Ogre::String texName =
loadChromaKeyedTexture("test.bmp", Ogre::ColourValue(1,0,0) );

Ogre::MaterialPtr mat = Ogre::MaterialManager::getSingleton().create
("yourMat", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

mat->getTechnique(0)->getPass(0)->setSceneBlending (Ogre::SBT_REPLACE);

mat->getTechnique(0)->getPass(0)
->setAlphaRejectSettings(Ogre::CMPF_GREATER_EQUAL, 128);

mat->getTechnique(0)->getPass(0)->setCullingMode (Ogre::CULL_NONE);


mat->getTechnique(0)->getPass(0)->setManualCullingMode (Ogre::MANUAL_CULL_NONE);

Ogre::TextureUnitState* t = mat->getTechnique(0)
->getPass(0)->createTextureUnitState(texName);

t->setTextureAddressingMode(Ogre::TextureUnitState::TAM_CLAMP);

miniScreen->setMaterial("yourMat");

-----

程式執行是正常的 但是貼出來的圖片 就是沒有任何的 透明化特效 產生

甚至是我最後將 透明化Function 中迴圈的 if判斷 註解掉

強硬的把每一個 像素 的 Alpha 都設為 0.0f 或是 0.5f 結果仍然是一樣沒有透明化

因此才又上來這邊 跟各位前輩請教 請各位前輩多多幫忙 謝謝大家 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-2-23, PM 7:10 星期一    文章主題: 引言回覆

我要更正一下 歹勢 <囧 ...我剛剛沒有測試 0.0f

若是用 0.5f 則設為 colourkey 的顏色依然會正常顯示

但若是使用 0.49 或以下 則 colourkey 的功能就能夠運作了

其實我原本以為 設定為 0.5f 或呈現 半透明 的狀況 但卻是只有 顯示 或 不顯示 兩種

而且要顯示的圖形邊緣 還是會有一點殘留 colourkey 的顏色 如下圖 :

http://www.wretch.cc/album/show.php?i=pleaselouis&b=32764&f=1376684128&p=5

請問有前輩知道 為什麼會這樣嗎?? 煩請不吝賜教 謝謝大家 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
songfat
時常出沒的會員


註冊時間: 2008-01-25
文章: 34

192.68 果凍幣

發表發表於: 2009-2-25, PM 10:13 星期三    文章主題: 引言回覆

pleaselouis 寫到:

若是用 0.5f 則設為 colourkey 的顏色依然會正常顯示
但若是使用 0.49 或以下 則 colourkey 的功能就能夠運作了
其實我原本以為 設定為 0.5f 或呈現 半透明 的狀況 但卻是只有 顯示 或 不顯示 兩種


ㄝ...此函式的功能就是用來做colorkey透空的效果呀,當然是只有顯示或不顯示兩種效果嚕。

pleaselouis 寫到:

mat->getTechnique(0)->getPass(0)
->setAlphaRejectSettings(Ogre::CMPF_GREATER_EQUAL, 128);


你應該查一下ogre manual有關pass中alphaRejct這個功能。照你所設定的,表示當texture中有任何pixel的alpha值大於等於128(也就是0.5f)時,pipeline才會畫出這個pixel。而你在比對keycolor和pixel color時,卻沒使用threshold,你的圖會有這樣的結果就表示你的字附近的pixel的red並不是1,而可能是0.9多之類的,用個threshold應該就可以了。
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-3-6, PM 4:04 星期五    文章主題: 引言回覆

大家好 小弟因最近工作較忙 所以比較少上來 這次關於此主題又有問題向大家請教

請各位前輩 幫幫忙 給在下一些幫助 謝謝大家 <(_ _)>

小弟我目前已經可以做到 透明色處理的功能 但是還有些異常問題發生

目前我針對一個 樹 的模組做載入顯示 其中分別對 setDepthWriteEnabled() 作測試

這是將參數設為 False 的情況 : http://0rz.tw/FbpI1

而這是將參數設為 True 的情況 : http://0rz.tw/Em40q


首先討論關於 True 的圖片 可以看見 每一片樹葉模組 會以底色 蓋住下面或後面的模組

原本希望的正常顯示畫面 應該是可以從 樹葉的縫隙中 看到其他樹葉或是枝幹

但卻完全被其底色所干擾 要是應用到人物的頭髮上 後果應該會蠻慘的...

以下是相關程式碼 :

Entity * EtTemp;

EtTemp->getSubEntity(mTextureSubMeshIndex)->getMaterial()->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBF_SOURCE_ALPHA,Ogre::SBF_ONE_MINUS_SOURCE_ALPHA);

EtTemp->getSubEntity(mTextureSubMeshIndex)->getMaterial()->getTechnique(0)->getPass(0)->setDepthWriteEnabled(true);



再來討論關於 False 的圖片 底色蓋住下面或後面的模組 略為減緩 但還是有出現

但由於參數為False 故對於 Depth 的判斷關閉了 所以可以看到應該在比較後面的樹葉


整塊的顯示在比較前面的位置 甚至是蓋住了前面的樹葉...

以下是相關程式碼 :

Entity * EtTemp;

EtTemp->getSubEntity(mTextureSubMeshIndex)->getMaterial()->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_REPLACE);

EtTemp->getSubEntity(mTextureSubMeshIndex)->getMaterial()->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false);



目前對於這樣的錯誤 幾乎沒有頭緒該如何解決

希望版上的前輩 可以再度指導一下晚輩 謝謝大家 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
songfat
時常出沒的會員


註冊時間: 2008-01-25
文章: 34

192.68 果凍幣

發表發表於: 2009-3-6, PM 5:36 星期五    文章主題: 引言回覆

pleaselouis 寫到:

首先討論關於 True 的圖片 可以看見 每一片樹葉模組 會以底色 蓋住下面或後面的模組
原本希望的正常顯示畫面 應該是可以從 樹葉的縫隙中 看到其他樹葉或是枝幹
但卻完全被其底色所干擾 要是應用到人物的頭髮上 後果應該會蠻慘的...


我不太了解,你的底色是指樹葉的texture?
如果透明色的功能你已經試出來了,那為什麼還會有這種問題?
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-3-6, PM 5:51 星期五    文章主題: 引言回覆

我希望呈現的正確版本 是可以從樹葉縫隙中看到下面的 樹葉 或是 枝幹

但是在其縫隙之間 卻是顯示底色 就是塗滿場景的顏色(我的程式預設為水藍色)

沒有說明清楚 造成你的誤會 非常抱歉 <(_ _)>

例如下面的圖片連結 就會看到頭髮的邊緣 把臉蓋住了

http://0rz.tw/XQJTI

目前研究覺得應該是關於 Depth 的問題 只是看了文件

只知道 似乎跟 setDepthWriteEnabled() setDepthCheckEnabled() setSceneBlending()

等相關Function有關係 但是目前測試仍是無法達到預期的效果 故上來發問

尤其是 setSceneBlending() 目前關於他的公式 :

(texture * sourceFactor) + (scene_pixel * destFactor)

還不是很能理解 正在研究中....<囧/...

麻煩你很不好意思 但還是請多多幫忙 謝謝
回頂端
檢視會員個人資料 發送私人訊息
songfat
時常出沒的會員


註冊時間: 2008-01-25
文章: 34

192.68 果凍幣

發表發表於: 2009-3-6, PM 10:21 星期五    文章主題: 引言回覆

pleaselouis 寫到:

我希望呈現的正確版本 是可以從樹葉縫隙中看到下面的 樹葉 或是 枝幹
但是在其縫隙之間 卻是顯示底色 就是塗滿場景的顏色(我的程式預設為水藍色)
沒有說明清楚 造成你的誤會 非常抱歉 <(_ _)>
例如下面的圖片連結 就會看到頭髮的邊緣 把臉蓋住了
http://0rz.tw/XQJTI
目前研究覺得應該是關於 Depth 的問題 只是看了文件
只知道 似乎跟 setDepthWriteEnabled() setDepthCheckEnabled() setSceneBlending()
等相關Function有關係 但是目前測試仍是無法達到預期的效果 故上來發問
尤其是 setSceneBlending() 目前關於他的公式 :
(texture * sourceFactor) + (scene_pixel * destFactor)
還不是很能理解 正在研究中....<囧/...
麻煩你很不好意思 但還是請多多幫忙 謝謝


會有這種結果大概是因為你先畫頭髮才畫頭顱吧,所以在做depth write的時候就算是頭髮沒貼到的地方,會因為用來貼頭髮的mesh而被改掉。
試著改變subentity的繪圖順序,將頭髮的entity最後再draw。
還有,現在沒有人製做模型頭髮是用一整塊mesh吧...請你們的建模人員參考一下dx sdk範例裡tiny那隻人物的頭髮。
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-3-9, AM 11:51 星期一    文章主題: 引言回覆

其實我的 頭髮 跟 臉部 都是個別獨立的Mesh 並不屬於同一個Mesh之下

原本是打算 在 SceneNode 中使用 Attach 的方式 將他們連結在一起

不過這樣好像跟 SubEntity 的順序沒有相關就是了...囧

看了文件 我認為應該是要使用 createSubMesh() 來將 頭髮加到臉部上

但是查詢網路上相關 createSubMesh() 的範例 都似乎是另外手動撰寫多邊形附加上去

而不是另外載入一個 Mesh 檔 將其附加上去 ...

不知道我這樣推測使用 createSubMesh() 是否是對的 又或者有其他好的方法

煩請您再指導小弟一番 非常感謝你的幫助 謝謝 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
songfat
時常出沒的會員


註冊時間: 2008-01-25
文章: 34

192.68 果凍幣

發表發表於: 2009-3-9, PM 1:07 星期一    文章主題: 引言回覆

pleaselouis 寫到:

其實我的 頭髮 跟 臉部 都是個別獨立的Mesh 並不屬於同一個Mesh之下

?我沒有說你的頭髮跟臉部是在一起呀,我是說頭髮不要用平面的mesh + 頭髮材質,而用像tiny那隻人物的頭髮一樣。

pleaselouis 寫到:

原本是打算 在 SceneNode 中使用 Attach 的方式 將他們連結在一起
不過這樣好像跟 SubEntity 的順序沒有相關就是了...囧
看了文件 我認為應該是要使用 createSubMesh() 來將 頭髮加到臉部上
但是查詢網路上相關 createSubMesh() 的範例 都似乎是另外手動撰寫多邊形附加上去而不是另外載入一個 Mesh 檔 將其附加上去 ...
不知道我這樣推測使用 createSubMesh() 是否是對的 又或者有其他好的方法
煩請您再指導小弟一番 非常感謝你的幫助 謝謝
<(_ _)>

就算你將頭髮跟臉部弄成一個mesh,問題依舊存在吧。
我上一個回復不是說了嗎?問題在你貼頭髮的那塊mesh。
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-3-9, PM 2:04 星期一    文章主題: 引言回覆

songfat 寫到:

會有這種結果大概是因為你先畫頭髮才畫頭顱吧,所以在做depth write的時候就算是頭髮沒貼到的地方,會因為用來貼頭髮的mesh而被改掉。
試著改變subentity的繪圖順序,將頭髮的entity最後再draw。


對不起 我真的不太了解 你說的 "試著改變subentity的繪圖順序,將頭髮的entity最後再draw" 的意思
我原本解讀為 錯誤原因為 頭髮 跟 臉 的繪圖順序不正確 必須要排序正確才可以 不過你又說不是 我真的不太了解 可以麻煩你再詳加解釋嗎??

songfat 寫到:

還有,現在沒有人製做模型頭髮是用一整塊mesh吧...請你們的建模人員參考一下dx sdk範例裡tiny那隻人物的頭髮。


非常謝謝你的建議 我會向他提出建議的 但是否可以再跟你請教 我遇到的問題 是否有其他解法可以使用呢??

麻煩你真的非常不好意思 但還是請你多多幫忙 非常謝謝你 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-3-11, PM 2:51 星期三    文章主題: 引言回覆

目前我似乎找到方法了 雖然好像沒有完全正確就是了

希望在更為複雜的 頭髮 或是類似的Mesh 也不會有太差的表現就好了

我的做法很簡單 就只是針對頭髮的 Entity 設定下列的程式碼 :


Entity * EtTemp;

EtTemp->setRenderQueueGroup( RENDER_QUEUE_6 );


而關於 setRenderQueueGroup 所使用的參數宣告如下 :


enum RenderQueueGroupID
{
RENDER_QUEUE_BACKGROUND = 0,
RENDER_QUEUE_SKIES_EARLY = 5,
RENDER_QUEUE_1 = 10,
RENDER_QUEUE_2 = 20,
RENDER_QUEUE_WORLD_GEOMETRY_1 = 25,
RENDER_QUEUE_3 = 30,
RENDER_QUEUE_4 = 40,
RENDER_QUEUE_MAIN = 50,
RENDER_QUEUE_6 = 60,
RENDER_QUEUE_7 = 70,
RENDER_QUEUE_WORLD_GEOMETRY_2 = 75,
RENDER_QUEUE_8 = 80,
RENDER_QUEUE_9 = 90,
RENDER_QUEUE_SKIES_LATE = 95,
RENDER_QUEUE_OVERLAY = 100,
RENDER_QUEUE_MAX = 105
};


雖然遠觀下 幾乎完全正確 但近觀下就有破碎的情形發生 如右 : http://0rz.tw/VWKXN

根據文件所述 此 Function 是把指定的 Entity 強制更動在 Render Queue 的位置

由於還是有錯誤情形 因此仍上來跟大家討論 請大家給予在下一些意見 謝謝 <(_ _)>
回頂端
檢視會員個人資料 發送私人訊息
songfat
時常出沒的會員


註冊時間: 2008-01-25
文章: 34

192.68 果凍幣

發表發表於: 2009-3-11, PM 8:20 星期三    文章主題: 引言回覆

pleaselouis 寫到:

目前我似乎找到方法了 雖然好像沒有完全正確就是了
希望在更為複雜的 頭髮 或是類似的Mesh 也不會有太差的表現就好了
我的做法很簡單 就只是針對頭髮的 Entity 設定下列的程式碼:
Entity * EtTemp;
EtTemp->setRenderQueueGroup( RENDER_QUEUE_6 );
雖然遠觀下 幾乎完全正確 但近觀下就有破碎的情形發生 如右 : http://0rz.tw/VWKXN
根據文件所述 此 Function 是把指定的 Entity 強制更動在 Render Queue 的位置
由於還是有錯誤情形 因此仍上來跟大家討論 請大家給予在下一些意見 謝謝 <(_ _)>


不管怎麼設定問題一定還是會存在,假設有另一塊頭髮x在頭髮y之後才render,而x的z又比較深,你依然無法透過y的空隙看到x。
回頂端
檢視會員個人資料 發送私人訊息
songfat
時常出沒的會員


註冊時間: 2008-01-25
文章: 34

192.68 果凍幣

發表發表於: 2009-3-14, AM 9:51 星期六    文章主題: 引言回覆

不知道你解決這問題了嗎?
如果還沒,或許你可以用stencil解決這個問題。
回頂端
檢視會員個人資料 發送私人訊息
pleaselouis
時常出沒的會員


註冊時間: 2008-11-03
文章: 32

504.97 果凍幣

發表發表於: 2009-4-15, PM 7:21 星期三    文章主題: 引言回覆

songfat 寫到:
不知道你解決這問題了嗎?
如果還沒,或許你可以用stencil解決這個問題。


因為最近非常忙 所以托到了現在才回你的文 非常抱歉

而由於我的主管 決定更換引擎製作 所以那個問題就暫時被擱置

目前則是全力進行其他專案中...
回頂端
檢視會員個人資料 發送私人訊息
songfat
時常出沒的會員


註冊時間: 2008-01-25
文章: 34

192.68 果凍幣

發表發表於: 2009-4-16, AM 3:47 星期四    文章主題: 引言回覆

哈哈@@"還可以中途換引擎喔?
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式進階班:各種進階圖型引擎或遊戲引擎 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

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


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