Irrlicht引擎学习笔记(12)--RenderToTexture

说明:

这个例子展示如何将渲染结果作为纹理使用.
详情请看源码及详细注释

注释及源码:

#include <iostream>
#include <irrlicht.h>
#include "driverChoice.h"

using namespace irr;

#ifdef _IRR_WINDOWS_
#pragma comment(lib, "irrlicht.lib")
//#pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")
#endif

/*
*四步:
*加载模型
*创建立方体
*创建纹理
*在循环函数中渲染
*/
int main(int argc, char** argv)
{
video::E_DRIVER_TYPE driverType = driverChoiceConsole();
IrrlichtDevice *device =
createDevice(driverType, core::dimension2d<u32>(720, 455), 32,
false, true, false, 0);
if (!device)
return 1;
device->setWindowCaption(L"quake3map");

video::IVideoDriver *driver = device->getVideoDriver();
scene::ISceneManager *smgr = device->getSceneManager();
gui::IGUIEnvironment *guiev = device->getGUIEnvironment();

/*
*1.加载模型
*设置属性:shininess,镜面反射率
*/
scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode(
smgr->getMesh("../media/faerie.md2"));
if (fairy)
{
fairy->setMaterialTexture(
0, driver->getTexture("../media/faerie2.bmp"));
fairy->setMaterialFlag(video::EMF_LIGHTING, true);
fairy->getMaterial(0).Shininess = 20.0f;//镜面反射率
fairy->setPosition(core::vector3df(-10, 0, -100));
fairy->setMD2Animation(scene::EMAT_STAND);
}
//添加动态光照
smgr->addLightSceneNode(0, core::vector3df(-15, 5, - 105), video::SColorf(1.0f, 1.0f, 1.0f));
//环境光
smgr->setAmbientLight(video::SColor(0, 60, 60, 60));

/*
*2.创建测试立方体
*/
scene::ISceneNode* test = smgr->addCubeSceneNode(60);
scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(
core::vector3df(0.3, 0.03, 0));
test->setPosition(core::vector3df(-100, 0, -100));
test->setMaterialFlag(video::EMF_LIGHTING, false);
test->addAnimator(anim);
anim->drop();

/*
*3.提前创建一个render target 纹理
*IVideoDriver::addRenderTargetTexture()
*注意:其大小不能超过帧缓存大小,因为它是共享帧缓存的z缓存实现的
*另外创建一个摄像机fixedCam来获取纹理
*检查硬件支持
*/
//render target
video::ITexture* rt = 0;
scene::ICameraSceneNode* fixedCam = 0;

if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET))
{
rt = driver->addRenderTargetTexture(core::dimension2d<u32>(256, 256), "RTT1");
test->setMaterialTexture(0, rt);//将纹理运用到立方体上

//添加fixedcamera
fixedCam = smgr->addCameraSceneNode(0,
core::vector3df(10, 10, -80), core::vector3df(-10,10,-100));
}
else//否则不支持,提示错误信息
{
guiev->getSkin()->setFont(guiev->getFont("../media/fonthaettenschweiler.bmp"));
gui::IGUIStaticText* text = guiev->addStaticText(
L"Hardware or this renderer is not to use the render to texture feature.RTT disabled", core::rect<s32>(150, 20, 470, 60));

text->setOverrideColor(video::SColor(100, 255, 255, 255));
}
//fpscamera
scene::ICameraSceneNode* fpsCamera = smgr->addCameraSceneNodeFPS();
fpsCamera->setPosition(core::vector3df(-50, 50, -150));
device->getCursorControl()->setVisible(false);
// smgr->addCameraSceneNode(0, core::vector3df(0, 30, -40), core::vector3df(0, 5, 0));

/*
*4.渲染部分
*每一帧渲染两次,
*一次用作纹理渲染
*一次如常
*纹理渲染时需要将立方体置为不可见,因为立方体上的纹理来自摄像机看到的图像...会迭代...自己想象
*/
int lastFPS = -1;
while (device->run())
{
driver->beginScene(true, true, video::SColor(255, 100, 101, 140));
if (rt)
{
//渲染纹理
//设置render target 纹理
driver->setRenderTarget(rt, true, true, video::SColor(0, 0, 0, 255));
//设置立方体不可见
test->setVisible(false);
//激活fixedCam
smgr->setActiveCamera(fixedCam);
//渲染
smgr->drawAll();
//恢复默认rendertarget
driver->setRenderTarget(0, true, true, 0);

//设置立方体可见
test->setVisible(true);
//激活fpsCamera
smgr->setActiveCamera(fpsCamera);
}
smgr->drawAll();
guiev->drawAll();

driver->endScene();

int fps = driver->getFPS();
if (lastFPS != fps)
{
core::stringw str = L"11.RenderToTexture [";
str += driver->getName();
str += "]FPS.",
str += fps;
device->setWindowCaption(str.c_str());
lastFPS = fps;
}
}
device->drop();

return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值