Ogre透明材质和纹理阴影

 

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_blendadd, modulatealpha_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编辑  收藏  举报

导航