OGRE水面 折射反射

//OGRE 水面 折射反射

//NOTE反射只反射水面以上的,折射只折射水面以下的。

#include "ExampleApplication.h"
#include "OgreHardwarePixelBuffer.h"
//定义全局变量。
Entity* pPlaneEntWater;
std::vector<Entity*> aboveWaterEnts;
std::vector<Entity*> belowWaterEnts;
Plane reflectionPlane;
Camera* theCam;

创建两个“侦听”类,折射与反射。
class RefractionTextureListener : public RenderTargetListener
{
public:
 void preRenderTargetUpdate(const RenderTargetEvent& evt)
 {
  // Hide plane and objects above the water
  pPlaneEntWater->setVisible(false);
  std::vector<Entity*>::iterator i, iend;
  iend = aboveWaterEnts.end();
  for (i = aboveWaterEnts.begin(); i != iend; ++i)
  {
   (*i)->setVisible(false);
  }

 }
 void postRenderTargetUpdate(const RenderTargetEvent& evt)
 {
  // Show plane and objects above the water
  pPlaneEntWater->setVisible(true);
  std::vector<Entity*>::iterator i, iend;
  iend = aboveWaterEnts.end();
  for (i = aboveWaterEnts.begin(); i != iend; ++i)
  {
   (*i)->setVisible(true);
  }
 }

};


class ReflectionTextureListener : public RenderTargetListener
{
public:
 void preRenderTargetUpdate(const RenderTargetEvent& evt)
 {
  // Hide plane and objects below the water
  pPlaneEntWater->setVisible(false);
  std::vector<Entity*>::iterator i, iend;
  iend = belowWaterEnts.end();
  for (i = belowWaterEnts.begin(); i != iend; ++i)
  {
   (*i)->setVisible(false);
  }
  theCam->enableReflection(reflectionPlane);

 }
 void postRenderTargetUpdate(const RenderTargetEvent& evt)
 {
  // Show plane and objects below the water
  pPlaneEntWater->setVisible(true);
  std::vector<Entity*>::iterator i, iend;
  iend = belowWaterEnts.end();
  for (i = belowWaterEnts.begin(); i != iend; ++i)
  {
   (*i)->setVisible(true);
  }
  theCam->disableReflection();
 }

};

//在应用类中,定义两个“侦听”变量。
    RefractionTextureListener mRefractionListener;
    ReflectionTextureListener mReflectionListener;
   
//在应用类中(这里theCam相当中介,若mCamera定义为全局,则可省略theCam这一变量)
    theCam = mCamera;

  // createManual(const String & name, const String& group,
  // TextureType texType, uint width, uint height, uint depth,
  // int num_mips, PixelFormat format, int usage = TU_DEFAULT, ManualResourceLoader* loader = 0,
  // bool hwGammaCorrection = false, uint fsaa = 0);
  //以下“手动”创建纹理。
  // Create a manual texture with a depth of 1 (not loaded from a file).
       
  TexturePtr mTexture = TextureManager::getSingleton().createManual( "Refraction",
   ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D,
   512, 512, 0, PF_R8G8B8, TU_RENDERTARGET );
  RenderTarget *rttTex = mTexture->getBuffer()->getRenderTarget();

  {
   //创建一个新的视口。
   Viewport *v = rttTex->addViewport( mCamera );
   //Examples/FresnelReflectionRefraction信息默认存储于Examples-Advanced.material中
   //选择FresnelReflectionRefraction材质中的Refraction材质
   MaterialPtr mat = MaterialManager::getSingleton().getByName("Examples/FresnelReflectionRefraction");
   mat->getTechnique(0)->getPass(0)->getTextureUnitState(2)->setTextureName("Refraction");
   
   //将视口的OGRE LOGO信息屏蔽
   v->setOverlaysEnabled(false);
   
   //折射效果
   rttTex->addListener(&mRefractionListener);
   //反射效果
   //rttTex->addListener(&mReflectionListener);
  }

  // 以下:创建一个“有纹理”平面,法线正Y,高度。
  reflectionPlane.normal = Vector3::UNIT_Y;
  reflectionPlane.d = 0;
  MeshManager::getSingleton().createPlane("ReflectPlane",
   ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
   reflectionPlane,1400,1400,10,10,true,1,3,5,Vector3::UNIT_Z);

  pPlaneEntWater = mSceneMgr->createEntity( "Waterplane", "ReflectPlane" );
  pPlaneEntWater->setMaterialName("Examples/FresnelReflectionRefraction");
  SceneNode *nodeW = mSceneMgr->getRootSceneNode()->createChildSceneNode("Waternode");
  nodeW->attachObject(pPlaneEntWater);
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值