You are on page 1of 8

UNIVERSIDAD DE IXTLAHUACA CUI. Licenciatura de Ingeniera en Computacin. Materia: Graficacin.

Trabajo: Proyecto de Render en OpenGL. ELABORADO POR:

Jimnez Robles Jess Eliseo GRUPO: A SEMESTRE: NOVENO

DESCRIPCION DEL PROGRAMA. El siguiente trabajo es un programa en OpenGL utilizando la tcnica de Render, en dicho programa se tiene la imagen de una hada la cual tiene unos ligeros movimientos y estos se ven reflejados en un cubo que se encuentra detrs de la imagen, dicho cubo se encuentra en movimiento el cual en cada uno de sus lados conforme va girando muestra los movimientos de la hada. A CONTINUACIN SE MUESTRA EL CDIGO DEL PROGRAMA.

#include <irrlicht.h> //libreria utilizada para realizar render con la imagen de una hada #include <iostream>

using namespace irr;

#pragma comment(lib, "Irrlicht.lib")

int main() { // se selecciona el driver de video

video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9; IrrlichtDevice *device = createDevice(driverType, core::dimension2d<s32>(640, 480), 16, false, false);

if (device == 0) return 1; // regresa si no se detecto algun driver de video

video::IVideoDriver* driver = device->getVideoDriver();

scene::ISceneManager* smgr = device->getSceneManager(); gui::IGUIEnvironment* env = device->getGUIEnvironment();

// se carga y muestra la malla de animacion

scene::IAnimatedMeshSceneNode* fairy = smgr->addAnimatedMeshSceneNode( smgr->getMesh("../../media/faerie.md2"));

if (fairy) { fairy->setMaterialTexture(0, driver->getTexture("../../media/faerie2.bmp")); // se establece la textura difusa fairy->setMaterialFlag(video::EMF_LIGHTING, true); // se permite la iluminacion dinamica fairy->getMaterial(0).Shininess = 20.0f; // se establecen el tamao de luces especulares fairy->setPosition(core::vector3df(-10,0,-100));//se establece la posicion fairy->setMD2Animation ( scene::EMAT_STAND ); }

/* Para hacer reflejos especulares en el modelo necesitamos una luz dinmica en la escena. Tenemos que aadirla directamente en las cercanas del modelo. Adems, que no debemos hacer que el modelo quede oscuro, establecemos la luz ambiental a gris. */

// se aade la luz blanca

scene::ILightSceneNode* light = smgr->addLightSceneNode(0, core::vector3df(-15,5,-105), video::SColorf(1.0f, 1.0f, 1.0f));

// se establece la luz ambiental smgr->setAmbientLight(video::SColor(0,60,60,60));

/* Lo siguiente es agregar una cmara controlada por el usuario y aadir un cubo de ensayo y se deje girar para hacer la escena ms interesante. */

// se aade la camara fps scene::ICameraSceneNode* fpsCamera = smgr->addCameraSceneNodeFPS(); fpsCamera->setPosition(core::vector3df(-50,50,-150));

// se desactiva el cursor del ratn device->getCursorControl()->setVisible(false);

// se crea el cubo de prueba scene::ISceneNode* test = smgr->addCubeSceneNode(60);

// se deja que el cubo gire y se establecen algunos ajustes de la luz 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); // se desactiva la iluminacin dinmica

test->addAnimator(anim); anim->drop();

// se establece ttulo de la ventana device->setWindowCaption(L"Proyecto Utilizando Render");

/* Para probar la funcin de la tectura con render , necesitamos una textura de destino de representacin. creamos una, que llamamos IVideoDriver :: createRenderTargetTexture () y especificamos el tamao de la textura. */

// crear el objetivo de render 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); // establecer material del cubo

// agregamos una cmara fija fixedCam = smgr->addCameraSceneNode(0, core::vector3df(10,10,-80), core::vector3df(-10,10,-100)); } else

{ // creamos un mensaje de error por si el hardware que utilizamos no es el adecuado gui::IGUISkin* skin = env->getSkin(); gui::IGUIFont* font = env->getFont("../../media/fonthaettenschweiler.bmp"); if (font) skin->setFont(font);

gui::IGUIStaticText* text = env->addStaticText( L"PROBLEMAS CON EL HARDWARE", core::rect<s32>(150,20,470,60));

text->setOverrideColor(video::SColor(100,255,255,255)); }

/* Ahora tenemos que sacar todo. Cada cuadro se dibuja en la escena dos veces. Una vez en que la cmara fija se muestra la textura de destino al renderizar hay que desactivar la visibilidad del cubo de prueba, ya que tiene la textura de destino de representacin aplicada a ella. */

int lastFPS = -1;

while(device->run()) if (device->isWindowActive()) { driver->beginScene(true, true, 0);

if (rt) { // se dibuja la escena de destino de representacin

// se establece el objetivo de hacer la textura driver->setRenderTarget(rt, true, true, video::SColor(0,0,0,255));

// hacer que el cubo fijo y la cmara esten invisibles y establecer la cmara como activa test->setVisible(false); smgr->setActiveCamera(fixedCam);

// se dibuja la escena en el tampn de render smgr->drawAll();

// retroceder hacia el destino anterior de render driver->setRenderTarget(0);

// hacer visible el cubo y ajustar la cmara controlada por el usuario como un activa test->setVisible(true); smgr->setActiveCamera(fpsCamera); }

// dibujar la escena normalmente smgr->drawAll(); env->drawAll();

driver->endScene();

// mostrar el numero de imgenes por segundo en la ventana int fps = driver->getFPS(); if (lastFPS != fps) { core::stringw str = L"Proyecto Utilizando Render"; str += " FPS:"; str += fps;

device->setWindowCaption(str.c_str()); lastFPS = fps; } }

if (rt) rt->drop(); // se termina el metodo render

device->drop(); // se deja de utilizar nuestro driver de video return 0; }

You might also like