作者mellean (莉莉姆)
看板GameDesign
标题Re: [请益] 请问关於 Ogre 材质 透明色 设定
时间Tue Feb 24 15:03:47 2009
※ 引述《pleaselouis (LOUISN)》之铭言:
: 大家好 我又来发问了 这次是关於 材质 的 透明色 设定问题
: 也就是小弟希望指定一个 ColourKey 让图片中和 ColourKey 一样的像素 显示为透明
: 而我是参考这篇文章 修改的 : http://0rz.tw/FBjS8
: 附带一提 我使用的Ogre版本为 1.49 而下面则是我的原始码 :
<恕删>
: /*再来是做一个 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);
想要看到按照alpha的半透明效果的话,scene blending不能使用replace
否则你看到的结果会变成要嘛是要画上去的来源颜色,否则就是原本的颜色
设定成SBT_TRANSPARENT_ALPHA看看,然後多设定blend factor如下
mat->getTechnique(0)->getPass(0)->setSceneBlending(
Ogre::SBF_SOURCE_ALPHA, Ogre::SBF_ONE_MINUS_SOURCE_ALPHA);
: mat->getTechnique(0)->getPass(0)
: ->setAlphaRejectSettings(Ogre::CMPF_GREATER_EQUAL, 128);
按照你另一篇的回文提到0.5f以下才会看到效果,是因为你在这边设定了alpha reject
按照你的设定alpha值大於等於0.5f的pixel就会被处理(显示出来)
如果想要看到半透明效果,只需要alpha大於0的需要被处理(0的pixel会看不到)
mat->getTechnique(0)->getPass(0)
->setAlphaRejectSettings(Ogre::CMPF_GREATER, 0);
如此设定的话,透明色的alpha就需要设成0.0f而不是0.5f
当贴图被放大的时候alpha层也会被处理
所以原本两相邻pixel的alpha为0与1的中间多出来的pixel的alpha便会介於0~1之间
此时使用alpha blending的话,就可以看到柔边的效果了
不过看起来会有透色不完全的感觉(就像你另一篇贴的图有红边,只是不会这麽锐利)
不想这样的话反而要把reject所需要的参考值设大(如你原本设的0.5f)
: 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 结果仍然是一样没有透明化
: 因此才又上来这边 跟各位前辈请教 请各位前辈多多帮忙 谢谢大家 <(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.128.139.157
※ 编辑: mellean 来自: 220.128.139.157 (02/24 15:11)
1F:推 pleaselouis:非常感谢你的回答 帮了很大的忙 谢谢你 02/24 16:10