Historique des modifications - Message

Message #7977

Sujet: Environement 3D


Type Date Auteur Contenu
Dernière modification 17-02-2010 17:23:19 Ilovechocolat
Le peut que je connait en shader c'est le tuto du site du zero, par contre je sait les mettre dans Irrlicht.
Par contre, ça m'étonnerais que ça soit possible avec les shader car la c'est pas modifier un rendu mais en assembler deux.

Sinon quelqu'un a testé ?

[EDIT] j'ai réussit a obtenir un FPS 4 fois plus rapide (donc un FPS de 4)en utilisant la methode drawPixel du driver, voici le code :

Code c++ :

#include <IRR/irrlicht.h>

class Vision3D
{
private :
irr::video::ITexture* redView;
irr::video::ITexture* blueView;
irr::scene::ISceneManager* smgr;
irr::video::IVideoDriver* driver;
int espacement;
public :
	Vision3D(irr::IrrlichtDevice *device, int paramEspacement = 5)
	{
		driver = device->getVideoDriver();
		smgr = device->getSceneManager();
		//on crée des nouvelles texture pour contenir le rendu
		redView = driver->addRenderTargetTexture(driver->getScreenSize(), "red", driver->getColorFormat());
		blueView = driver->addRenderTargetTexture(driver->getScreenSize(), "blue", driver->getColorFormat());
		//par défault l'espacement entre les deux vue est de 5
		espacement = paramEspacement;
	}
	void drawAll()
	{
		//on sauvegarde la position de la cam
		irr::scene::ICameraSceneNode* camera = smgr->getActiveCamera();
		irr::core::vector3df posCam = camera->getPosition();
		//on déplace légerement la cam
		camera->setPosition(posCam + irr::core::vector3df(espacement, 0, 0));
		//on imprime le rendu dans la texture
		driver->setRenderTarget(blueView, true, true, irr::video::SColor(0,0,0,0));
        smgr->drawAll();
		//on déplace légerement la cam
		camera->setPosition(posCam - irr::core::vector3df(espacement, 0, 0));
		//on imprime le rendu dans la texture
		driver->setRenderTarget(redView, true, true, irr::video::SColor(0,0,0,0));
        smgr->drawAll();
		//on remet la position de la camera et le pointeur vers la texture de rendu par default
		camera->setPosition(posCam);
		driver->setRenderTarget(0, true, true, 0);

		//on converti les texture en image et on crée une nouvelle image pour contenir le rendu en 3D
		irr::video::IImage* imageRed = driver->createImage(redView, irr::core::position2d<irr::s32>(0,0), driver->getScreenSize());
		irr::video::IImage* imageBlue = driver->createImage(blueView, irr::core::position2d<irr::s32>(0,0), driver->getScreenSize());

		//on applique le filtre de couleur
		for(int x = 0; x < driver->getScreenSize().Width; x++)
		{
			for(int y = 0; y < driver->getScreenSize().Height; y++)
			{
				driver->drawPixel(x, y, irr::video::SColor(255, imageRed->getPixel(x, y).getAverage(), 0, imageBlue->getPixel(x, y).getAverage()));
			}
		}
	}
};

int main()
{
    irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(640, 480), 16, false, false);
    if (device == 0)
        return 1;
    irr::video::IVideoDriver* driver = device->getVideoDriver();
    irr::scene::ISceneManager* smgr = device->getSceneManager();
    device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3");
    irr::scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");
    irr::scene::ISceneNode* node = 0;
	Vision3D vision3D(device);

    if (mesh)
        node = smgr->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024);
    if (node)
        node->setPosition(irr::core::vector3df(-1300,-144,-1249));
    smgr->addCameraSceneNodeFPS();
    device->getCursorControl()->setVisible(false);
    int lastFPS = -1;

	irr::video::ITexture* blueRed = driver->addRenderTargetTexture(driver->getScreenSize(), "red", driver->getColorFormat());
    irr::video::ITexture* blueView = driver->addRenderTargetTexture(driver->getScreenSize(), "blue", driver->getColorFormat());

    while(device->run())
    {
        driver->beginScene(true, true, 0);
		vision3D.drawAll();
        driver->endScene();

        int fps = driver->getFPS();

        if (lastFPS != fps)
        {
            irr::core::stringw str = L"Irrlicht Engine - 3D example [";
            str += driver->getName();
            str += "] FPS:";
            str += fps;

            device->setWindowCaption(str.c_str());
            lastFPS = fps;
        }
    }
    device->drop();
    return 0;
}
Création du message 17-02-2010 17:00:15 Ilovechocolat
Le peut que je connait en shader c'est le tuto du site du zero, par contre je sait les mettre dans Irrlicht.
Par contre, ça m'étonnerais que ça soit possible avec les shader car la c'est pas modifier un rendu mais en assembler deux.

Sinon quelqu'un a testé ?

[EDIT] j'ai réussit a obtenir un FPS 4 fois plus rapide (donc un FPS de 4)en utilisant la methode drawPixel du driver, voici le code :

Code c++ :

#include <IRR/irrlicht.h>

class Vision3D
{
private :
irr::video::ITexture* redView;
irr::video::ITexture* blueView;
irr::scene::ISceneManager* smgr;
irr::video::IVideoDriver* driver;
int espacement;
public :
	Vision3D(irr::IrrlichtDevice *device, int paramEspacement = 5)
	{
		driver = device->getVideoDriver();
		smgr = device->getSceneManager();
		//on crée des nouvelles texture pour contenir le rendu
		redView = driver->addRenderTargetTexture(driver->getScreenSize(), "red", driver->getColorFormat());
		blueView = driver->addRenderTargetTexture(driver->getScreenSize(), "blue", driver->getColorFormat());
		//par défault l'espacement entre les deux vue est de 5
		espacement = paramEspacement;
	}
	void drawAll()
	{
		//on sauvegarde la position de la cam
		irr::scene::ICameraSceneNode* camera = smgr->getActiveCamera();
		irr::core::vector3df posCam = camera->getPosition();
		//on déplace légerement la cam
		camera->setPosition(posCam + irr::core::vector3df(espacement, 0, 0));
		//on imprime le rendu dans la texture
		driver->setRenderTarget(blueView, true, true, irr::video::SColor(0,0,0,0));
        smgr->drawAll();
		//on déplace légerement la cam
		camera->setPosition(posCam - irr::core::vector3df(espacement, 0, 0));
		//on imprime le rendu dans la texture
		driver->setRenderTarget(redView, true, true, irr::video::SColor(0,0,0,0));
        smgr->drawAll();
		//on remet la position de la camera et le pointeur vers la texture de rendu par default
		camera->setPosition(posCam);
		driver->setRenderTarget(0, true, true, 0);

		//on converti les texture en image et on crée une nouvelle image pour contenir le rendu en 3D
		irr::video::IImage* imageRed = driver->createImage(redView, irr::core::position2d<irr::s32>(0,0), driver->getScreenSize());
		irr::video::IImage* imageBlue = driver->createImage(blueView, irr::core::position2d<irr::s32>(0,0), driver->getScreenSize());

		//on applique le filtre de couleur
		for(int x = 0; x < driver->getScreenSize().Width; x++)
		{
			for(int y = 0; y < driver->getScreenSize().Height; y++)
			{
				driver->drawPixel(x, y, irr::video::SColor(255, imageRed->getPixel(x, y).getAverage(), 0, imageBlue->getPixel(x, y).getAverage()));
			}
		}
	}
};

int main()
{
    irr::IrrlichtDevice *device = irr::createDevice(irr::video::EDT_OPENGL, irr::core::dimension2d<irr::u32>(640, 480), 16, false, false);
    if (device == 0)
        return 1;
    irr::video::IVideoDriver* driver = device->getVideoDriver();
    irr::scene::ISceneManager* smgr = device->getSceneManager();
    device->getFileSystem()->addZipFileArchive("map-20kdm2.pk3");
    irr::scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");
    irr::scene::ISceneNode* node = 0;
	Vision3D vision3D(device);

    if (mesh)
        node = smgr->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024);
    if (node)
        node->setPosition(irr::core::vector3df(-1300,-144,-1249));
    smgr->addCameraSceneNodeFPS();
    device->getCursorControl()->setVisible(false);
    int lastFPS = -1;

	irr::video::ITexture* blueRed = driver->addRenderTargetTexture(driver->getScreenSize(), "red", driver->getColorFormat());
    irr::video::ITexture* blueView = driver->addRenderTargetTexture(driver->getScreenSize(), "blue", driver->getColorFormat());

    while(device->run())
    {
        driver->beginScene(true, true, 0);
		vision3D.drawAll();
        driver->endScene();

        int fps = driver->getFPS();

        if (lastFPS != fps)
        {
            irr::core::stringw str = L"Irrlicht Engine - 3D example [";
            str += driver->getName();
            str += "] FPS:";
            str += fps;

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

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
111 invités en ligne
membre en ligne: -
RSS Feed