上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
pleaselouis 時常出沒的會員
註冊時間: 2008-11-03 文章: 32
505.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
505.97 果凍幣
|
|
回頂端 |
|
|
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
505.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
505.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
505.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
505.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
505.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
505.97 果凍幣
|
發表於: 2009-4-15, PM 7:21 星期三 文章主題: |
|
|
songfat 寫到: | 不知道你解決這問題了嗎?
如果還沒,或許你可以用stencil解決這個問題。 |
因為最近非常忙 所以托到了現在才回你的文 非常抱歉
而由於我的主管 決定更換引擎製作 所以那個問題就暫時被擱置
目前則是全力進行其他專案中... |
|
回頂端 |
|
|
songfat 時常出沒的會員
註冊時間: 2008-01-25 文章: 34
192.68 果凍幣
|
發表於: 2009-4-16, AM 3:47 星期四 文章主題: |
|
|
哈哈@@"還可以中途換引擎喔? |
|
回頂端 |
|
|
|