//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);