123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- <html>
- <head>
- <title>Irrlicht Engine Tutorial</title>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- </head>
- <body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
- <br>
- <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
- <tr>
- <td bgcolor="#666699" width="10"><b><a href="http://irrlicht.sourceforge.net" target="_blank"><img src="../../media/irrlichtlogo.jpg" width="88" height="31" border="0"></a></b></td>
- <td bgcolor="#666699" width="100%">
- <div align="center">
- <div align="left"><b><font color="#FFFFFF">Tutorial 13. Render to Texture</font></b></div>
- </div>
- </td>
- </tr>
- <tr bgcolor="#eeeeff">
- <td height="90" colspan="2">
- <div align="left">
- <p> This tutorial shows how to render to a texture using Irrlicht. Render
- to texture is a feature with which it is possible to create nice special
- effects. In addition, this tutorial shows how to enable specular highlights.</p>
- <p>The program which is described here will look like this:</p>
- <p align="center"><img src="../../media/013shot.jpg" width="256" height="200"><br>
- </p>
- </div>
- </td>
- </tr>
- </table>
- <br>
- <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
- <tr>
- <td bgcolor="#666699"> <b><font color="#FFFFFF">Lets start!</font></b></td>
- </tr>
- <tr>
- <td height="90" bgcolor="#eeeeff" valign="top"> <div align="left">
- <div align="left">
- <p>In the beginning, everything as usual. Include the needed headers,
- ask the user for the rendering driver, create the Irrlicht Device:</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre>#include <irrlicht.h>
- #include <iostream>
- using namespace irr;
- #pragma comment(lib, "Irrlicht.lib")
- int main()
- {
- // let user select driver type
- video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;
- printf("Please select the driver you want for this example:\n"\<br> " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\<br> " (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\<br> " (f) NullDevice\n (otherKey) exit\n\n");
- char i;
- std::cin >> i;
- switch(i)<br> {<br> case 'a': driverType = video::EDT_DIRECT3D9;break;<br> case 'b': driverType = video::EDT_DIRECT3D8;break;<br> case 'c': driverType = video::EDT_OPENGL; break;<br> case 'd': driverType = video::EDT_SOFTWARE; break;<br> case 'e': driverType = video::EDT_BURNINGSVIDEO;break;<br> case 'f': driverType = video::EDT_NULL; break;<br> default: return 1;<br> }
- // create device and exit if creation failed
- IrrlichtDevice *device =
- createDevice(driverType, core::dimension2d<s32>(640, 480),
- 16, false, false);
- if (device == 0)
- return 1; // could not create selected driver.
- video::IVideoDriver* driver = device->getVideoDriver();
- scene::ISceneManager* smgr = device->getSceneManager();
- gui::IGUIEnvironment* env = device->getGUIEnvironment();</pre></td>
- </tr>
- </table>
- <p>Now, we load an animated mesh to be displayed. As in most examples,
- we'll take the fairy md2 model. The difference here: We set the shininess<br>
- of the model to a value other than 0 which is the default value. This
- enables specular highlights on the model if dynamic lighting is on.
- The value influences the size of the highlights.</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre>// load and display animated fairy mesh
- scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode(
- smgr->getMesh("../../media/faerie.md2"));
- if (fairy)
- {
- fairy->setMaterialTexture(0, driver->getTexture("../../media/faerie2.bmp")); // set diffuse texture
- fairy->setMaterialFlag(video::EMF_LIGHTING, true); // enable dynamic lighting
- fairy->getMaterial(0).Shininess = 20.0f; // set size of specular highlights
- fairy->setPosition(core::vector3df(-10,0,-100));
- }</pre></td>
- </tr>
- </table>
- <p> To make specular highlights appear on the model, we need a dynamic
- light in the scene. We add one directly in vicinity of the model.
- In addition, to make the model not that dark, we set the ambient light
- to gray. </p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre>
- // add white light
- scene::ILightSceneNode* light = smgr->addLightSceneNode(0,
- core::vector3df(-15,5,-105), video::SColorf(1.0f, 1.0f, 1.0f));
- // set ambient light
- driver->setAmbientLight(video::SColor(0,60,60,60));</pre></td>
- </tr>
- </table>
- <p>The next is just some standard stuff: Add a user controlled camera
- to the scene, disable mouse cursor, and add a test cube and let it
- rotate to make the scene more interesting.</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre>
- // add fps camera
- scene::ICameraSceneNode* fpsCamera = smgr->addCameraSceneNodeFPS();
- fpsCamera->setPosition(core::vector3df(-50,50,-150));
- // disable mouse cursor
- device->getCursorControl()->setVisible(false);
- // create test cube
- scene::ISceneNode* test = smgr->addCubeSceneNode(60);
- // let the cube rotate and set some light settings
- scene::ISceneNodeAnimator* anim = smgr->createRotationAnimator(
- core::vector3df(0.3f, 0.3f,0));
- test->setPosition(core::vector3df(-100,0,-100));
- test->setMaterialFlag(video::EMF_LIGHTING, false); // disable dynamic lighting
- test->addAnimator(anim);
- anim->drop();
- // set window caption
- device->setWindowCaption(L"Irrlicht Engine - Render to Texture and Specular Highlights example");</pre></td>
- </tr>
- </table>
- <p> To test out the render to texture feature, we need a render target
- texture. These are not like standard textures, but need to be created
- first. To create one, we call IVideoDriver::createRenderTargetTexture()
- and specify the size of the texture. Please don't use sizes bigger
- than the frame buffer for this, because the render target shares the
- zbuffer with the frame buffer. And because we want to render the scene
- not from the user camera into the texture, we add another, fixed camera
- to the scene. But before we do all this, we check if the current running
- driver is able to render to textures. If it is not, we simply display
- a warning text.</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre>// create render target
- video::ITexture* rt = 0;
- scene::ICameraSceneNode* fixedCam = 0;
-
- if (driver->queryFeature(video::EVDF_RENDER_TO_TARGET))
- {
- rt = driver->createRenderTargetTexture(core::dimension2d<s32>(256,256));
- test->setMaterialTexture(0, rt); // set material of cube to render target
- // add fixed camera
- fixedCam = smgr->addCameraSceneNode(0, core::vector3df(10,10,-80),
- core::vector3df(-10,10,-100));
- }
- else
- {
- // create problem text
- gui::IGUISkin* skin = env->getSkin();
- gui::IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp");
- if (font)
- skin->setFont(font);
- gui::IGUIStaticText* text = env->addStaticText(
- L"Your hardware or this renderer is not able to use the "\
- L"render to texture feature. RTT Disabled.",
- core::rect<s32>(150,20,470,60));
- text->setOverrideColor(video::SColor(100,255,255,255));
- }</pre></td>
- </tr>
- </table>
- <p> Nearly finished. Now we need to draw everything. Every frame, we
- draw the scene twice. Once from the fixed camera into the render target
- texture and once as usual. When rendering into the render target,
- we need to disable the visibilty of the test cube, because it has
- the render target texture applied to it.<br>
- That's, wasn't quite complicated I hope. :)</p>
- <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
- <tr>
- <td><pre>while(device->run())
- if (device->isWindowActive())
- {
- driver->beginScene(true, true, 0);
- if (rt)
- {
- // draw scene into render target
-
- // set render target texture
- driver->setRenderTarget(rt, true, true, video::SColor(0,0,0,255));
- // make cube invisible and set fixed camera as active camera
- test->setVisible(false);
- smgr->setActiveCamera(fixedCam);
- // draw whole scene into render buffer
- smgr->drawAll();
- // set back old render target
- driver->setRenderTarget(0);
- // make the cube visible and set the user controlled camera as active one
- test->setVisible(true);
- smgr->setActiveCamera(fpsCamera);
- }
-
- // draw scene normally
- smgr->drawAll();
- env->drawAll();
- driver->endScene();
- }
- if (rt)
- rt->drop(); // drop render target because we created if with a create() method
- device->drop(); // drop device
- return 0;
- }
- </pre></td>
- </tr>
- </table>
-
- <p> </p></div>
- </div>
- </td>
- </tr>
- </table>
- <p> </p>
- </body>
- </html>
|