Ogre透明材质和纹理阴影
Ogre::MaterialPtr meterialPtr=Ogre::MaterialManager::getSingleton().getByName(meterialName);
Ogre::Pass *pass=meterialPtr->getTechnique(0)->getPass(0);
if (pass)
{
pass->setSceneBlending(Ogre::SBT_TRANSPARENT_ALPHA);
pass->setDepthWriteEnabled(false);
/*pass->setDepthCheckEnabled(false);*/
pass->setDiffuse(1.0,1.0,1.0,(float)nAlpha/255);
//pass->getTextureUnitState(0)->setAlphaOperation(Ogre::LBX_MODULATE, Ogre::LBS_TEXTURE, Ogre::LBS_MANUAL,1.0, (float)nAlpha/255);
}
或者直接在材质文件里面配置
material 123
{
technique
{
pass
{
ambient 0.588 0.588 0.588 1
diffuse 1.0 1.0 1.0 0.15//修改alpha就可
specular 0.045 0.045 0.045 1 10
scene_blend alpha_blend
depth_write off
texture_unit
{
texture 123.bmp
}
}
}
}
如何设置透明
在.material文件里,你可以设置 scene_blend 为 add, modulate 或 alpha_blend.
scene_blend add
你可以使用JPEG 或 PNG文件为纹理
图象全黑的地方为透明
在爆炸,光晕,灯光等方面使用
scene_blend modulate
你可以使用JPEG或PNG文件为纹理, 纹理会根据背景进行想乘,通常它的颜色比图片
要暗. 纹理黑的部分为透明.
sene_blend alpha_blend
你可以使用PNG图象文件为纹理,要在PNG文件里设置透明,你需要用Photoshop来处理它
通过把背景层删除,并 在其他层使用橡皮擦.
被擦掉的地方为透明
投射阴影
一个实体可以投射影子,默认的,光不能投射阴影.
这里有4种阴影渲染的技术 TENCIL or TEXTURE, and ADDITIVE or MODULATIVE.
(CPU最适合是的SHADOWTYPE_TEXTURE_MODULATIVE)
STENCIL SHADOWS (模板阴影):
这个技术使用CPU来渲染
你可以设置最大距离(调用setShadowFarDistance),来维持一个好的帧率
投影的网格要是完全的(封闭和无洞).
避免过长的影子
避免对象距离光太近
这个技术允许自投影
这个影子有硬边(在影子和光之间进行硬转化)
TEXTURE SHADOWS (纹理阴影):
这个技术使用显卡进行渲染
这个技术只在方向光和聚光等下工作
这个技术不允许自投影
meshes 要定义 shadow caster 和 shadows receiver
避免过长的影子
避免对象距离光太近
影子有一个柔和的边缘
影子的颜色和精确度可以进行定义
例子:
mSceneMgr->setShadowsTechnique(SHADOWTYPE_TEXTURE_MODULATIVE);
mSceneMgr->setShadowColour( ColourValue(0.5, 0.5, 0.5) );
...
mLight->setCastShadows(true);
...
mCastingObject->setCastShadows(true);
mReceivingObject->setCastShadows(false);
...
myMaterial->setReceiveShadows(true);
...
注释: myMaterial->setReceiveShadows(true)指令可以替代在material文件里的receive_shadows on
在材质的默认设置里是ON, 你可以在在材质里设置为 OFF来不让他接收阴影,这样可以节省一些帧率
material VMtl06
{
technique
{
pass
{
specular 0 0 0 1 1.7
scene_blend alpha_blend
alpha_rejection greater 128
cull_hardware none
cull_software none
texture_unit
{
texture Tr094.png
}
}
}
}
void CApplication::createScene()
{
OgreMax::OgreMaxScene* m_maxScene1=new OgreMax::OgreMaxScene();
m_maxScene1->Load("t1.scene",m_ActiveWindow,OgreMax::OgreMaxScene::NO_OPTIONS,m_SceneManager);
m_SceneManager=m_maxScene1->GetSceneManager();
//得到场景中的具体材质并对材质进行修改
Ogre::MaterialPtr mat= MaterialManager::getSingleton().getByName
("ssA1mat512_OgreMax");
mat->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_REPLACE);
}
posted on 2012-11-16 15:20 virtorld小康 阅读(1825) 评论(0) 编辑 收藏 举报