Historique des modifications - Message

Message #6553

Sujet: C++ Frustrum Culling


Type Date Auteur Contenu
Dernière modification 30-08-2009 23:33:42 hardcpp
Hello sa fait un baille que j'ai pas poster une ressource x), donc j'ai mit au point mon système de frustrum culling en me basant sur celui de tmyke concrètement cela sert a masquer les node non visible et donc de gagner du frame rate





FrustrumCulling.hppFrustrumCulling.cppPlane.hppPlane.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
///--------------------------------------------------------------------------------
/// @file FrustrumCulling.hpp
/// @brief Technique de culling par masquage d'objet non visible
///--------------------------------------------------------------------------------
#ifndef __FRUSTRUMCULLING_HPP_INCLUDED__
#define __FRUSTRUMCULLING_HPP_INCLUDED__

#include "Plane.hpp"
#include <irrlicht.h>

namespace App { namespace Engine { namespace Culling {

	///--------------------------------------------------------------------------------
	/// Technique de culling par masquage d'objet non visible
	///--------------------------------------------------------------------------------
	class FrustrumCulling
	{
		public:
			///--------------------------------------------------------------------------------
			/// Constructeur
			///
			/// @param _SceneManager : Gestionnaire de scene
			///--------------------------------------------------------------------------------
			FrustrumCulling(irr::scene::ISceneManager * _SceneManager);
			///--------------------------------------------------------------------------------
			/// Destructeur
			///--------------------------------------------------------------------------------
			~FrustrumCulling();

			///--------------------------------------------------------------------------------
			/// Pour crée le culling
			///--------------------------------------------------------------------------------
			void Create();
			///--------------------------------------------------------------------------------
			/// Pour recrée le culling
			///--------------------------------------------------------------------------------
			void Recreate();

			///--------------------------------------------------------------------------------
			/// Pour mettre a jour le culling
			///--------------------------------------------------------------------------------
			void Update();

			///--------------------------------------------------------------------------------
			/// Pour ajouter un scene node
			///
			/// @param _SceneNode : Pointeur vers le scene node
			///--------------------------------------------------------------------------------
			void AddSceneNode(const irr::scene::ISceneNode * _SceneNode);
			///--------------------------------------------------------------------------------
			/// Pour supprimer un scene node
			///
			/// @param _SceneNode : Pointeur vers le scene node
			///--------------------------------------------------------------------------------
			void RemoveSceneNode(const irr::scene::ISceneNode * _SceneNode);

			///--------------------------------------------------------------------------------
			/// Pour tester si une box et visible
			///
			/// @param _Box : Box a tester
			///--------------------------------------------------------------------------------
			bool IsVisible(const irr::core::aabbox3d<irr::f32>& box);

		private:
			///--------------------------------------------------------------------------------
			/// Gestionnaire de scene
			///--------------------------------------------------------------------------------
			irr::scene::ISceneManager * m_SceneManager;
			///--------------------------------------------------------------------------------
			/// Pour stocker les nodes
			///--------------------------------------------------------------------------------
			irr::core::array<irr::scene::ISceneNode *> m_Nodes;
			///--------------------------------------------------------------------------------
			/// Pour tester si un node est visible
			///--------------------------------------------------------------------------------
			App::Core::Plane m_FrustumPlane[6];
			///--------------------------------------------------------------------------------
			/// Dernier / derniere position et cible de la camera
			///--------------------------------------------------------------------------------
			irr::core::vector3df m_LastPosition, m_LastTarget;
	};

}	// Culling
}	// Engine
}	// App

#endif	// __FRUSTRUMCULLING_HPP_INCLUDED__

Donc voila alors pour l'utilisation ajouter juste avant la boucle de rendu

Code c++ :

App::Engine::Culling::FrustrumCulling * m_FrustrumCulling = new App::Engine::Culling::FrustrumCulling(m_SceneManager);
m_FrustrumCulling->Create();

et dans le boucle de rendu

Code c++ :

m_FrustrumCulling->Update();
m_Driver->beginScene(.........

=========================================

Exemple complet :

Code c++ :

#include <irrlicht.h>
#include "FrustrumCulling.hpp"

using namespace irr;

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

int main()
{
	irr::SIrrlichtCreationParameters m_IrrlichtCreationParameters;
	m_IrrlichtCreationParameters.AntiAlias			= true;
	m_IrrlichtCreationParameters.Bits				= 32;
	m_IrrlichtCreationParameters.DriverType			= irr::video::EDT_DIRECT3D9;
	m_IrrlichtCreationParameters.Fullscreen			= false;
	m_IrrlichtCreationParameters.HighPrecisionFPU	= true;
	m_IrrlichtCreationParameters.Stencilbuffer		= true;
	m_IrrlichtCreationParameters.WindowSize			= irr::core::dimension2di(800,600);

	irr::IrrlichtDevice			* m_Device			= irr::createDeviceEx(m_IrrlichtCreationParameters);
	irr::video::IVideoDriver	* m_Driver			= m_Device->getVideoDriver();
	irr::scene::ISceneManager	* m_SceneManager	= m_Device->getSceneManager();

	for( int x = 0 ; x != 10 ; x++)
		for( int y = 0 ; y != 10 ; y++)
			for( int z = 0 ; z != 10 ; z++)
				m_SceneManager->addCubeSceneNode(1, 0 , -1, irr::core::vector3df(x * 10 ,y* 10, z* 10));

	irr::scene::ICameraSceneNode * m_Camera = m_SceneManager->addCameraSceneNodeFPS(0, 40.f, 0.01f);
	m_Camera->setPosition(m_Camera->getPosition() + irr::core::vector3df(0,20,0));
   
	App::Engine::Culling::FrustrumCulling * m_FrustrumCulling = new App::Engine::Culling::FrustrumCulling(m_SceneManager);

	m_FrustrumCulling->Create();
	int __LastFPS = -1;

	while(m_Device->run())
	{
		if (m_Device->isWindowActive())
		{
			m_FrustrumCulling->Update();
			m_Driver->beginScene(true, true, irr::video::SColor(0,200,200,200));
			m_SceneManager->drawAll();
			m_Driver->endScene();
			
			int __Fps = m_Driver->getFPS();
			if (__LastFPS != __Fps)
			{
				core::stringw __Str;
				__Str += "FPS:";
				__Str += __Fps;
				m_Device->setWindowCaption(__Str.c_str());
				__LastFPS = __Fps;
			}

		}
	}
	delete m_FrustrumCulling;
	m_Device->drop();

	return 0;
}
Création du message 26-06-2009 22:40:06 hardcpp
Hello sa fait un baille que j'ai pas poster une ressource x), donc j'ai mit au point mon système de frustrum culling en me basant sur celui de tmyke concrètement cela sert a masquer les node non visible et donc de gagner du frame rate





FrustrumCulling.hppFrustrumCulling.cppPlane.hppPlane.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
///--------------------------------------------------------------------------------
/// @file FrustrumCulling.hpp
/// @brief Technique de culling par masquage d'objet non visible
///--------------------------------------------------------------------------------
#ifndef __FRUSTRUMCULLING_HPP_INCLUDED__
#define __FRUSTRUMCULLING_HPP_INCLUDED__

#include "Plane.hpp"
#include <irrlicht.h>

namespace App { namespace Engine { namespace Culling {

	///--------------------------------------------------------------------------------
	/// Technique de culling par masquage d'objet non visible
	///--------------------------------------------------------------------------------
	class FrustrumCulling
	{
		public:
			///--------------------------------------------------------------------------------
			/// Constructeur
			///
			/// @param _SceneManager : Gestionnaire de scene
			///--------------------------------------------------------------------------------
			FrustrumCulling(irr::scene::ISceneManager * _SceneManager);
			///--------------------------------------------------------------------------------
			/// Destructeur
			///--------------------------------------------------------------------------------
			~FrustrumCulling();

			///--------------------------------------------------------------------------------
			/// Pour crée le culling
			///--------------------------------------------------------------------------------
			void Create();
			///--------------------------------------------------------------------------------
			/// Pour recrée le culling
			///--------------------------------------------------------------------------------
			void Recreate();

			///--------------------------------------------------------------------------------
			/// Pour mettre a jour le culling
			///--------------------------------------------------------------------------------
			void Update();

			///--------------------------------------------------------------------------------
			/// Pour ajouter un scene node
			///
			/// @param _SceneNode : Pointeur vers le scene node
			///--------------------------------------------------------------------------------
			void AddSceneNode(const irr::scene::ISceneNode * _SceneNode);
			///--------------------------------------------------------------------------------
			/// Pour supprimer un scene node
			///
			/// @param _SceneNode : Pointeur vers le scene node
			///--------------------------------------------------------------------------------
			void RemoveSceneNode(const irr::scene::ISceneNode * _SceneNode);

			///--------------------------------------------------------------------------------
			/// Pour tester si une box et visible
			///
			/// @param _Box : Box a tester
			///--------------------------------------------------------------------------------
			bool IsVisible(const irr::core::aabbox3d<irr::f32>& box);

		private:
			///--------------------------------------------------------------------------------
			/// Gestionnaire de scene
			///--------------------------------------------------------------------------------
			irr::scene::ISceneManager * m_SceneManager;
			///--------------------------------------------------------------------------------
			/// Pour stocker les nodes
			///--------------------------------------------------------------------------------
			irr::core::array<irr::scene::ISceneNode *> m_Nodes;
			///--------------------------------------------------------------------------------
			/// Pour tester si un node est visible
			///--------------------------------------------------------------------------------
			App::Core::Plane m_FrustumPlane[6];
			///--------------------------------------------------------------------------------
			/// Dernier / derniere position et cible de la camera
			///--------------------------------------------------------------------------------
			irr::core::vector3df m_LastPosition, m_LastTarget;
	};

}	// Culling
}	// Engine
}	// App

#endif	// __FRUSTRUMCULLING_HPP_INCLUDED__

Donc voila alors pour l'utilisation ajouter juste avant la boucle de rendu

Code c++ :

App::Engine::Culling::FrustrumCulling * m_FrustrumCulling = new App::Engine::Culling::FrustrumCulling(m_SceneManager);
m_FrustrumCulling->Create();

et dans le boucle de rendu

Code c++ :

m_FrustrumCulling->Update();
m_Driver->beginScene(.........

=========================================

Exemple complet :

Code c++ :

#include <irrlicht.h>
#include "FrustrumCulling.hpp"

using namespace irr;

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

int main()
{
	irr::SIrrlichtCreationParameters m_IrrlichtCreationParameters;
	m_IrrlichtCreationParameters.AntiAlias			= true;
	m_IrrlichtCreationParameters.Bits				= 32;
	m_IrrlichtCreationParameters.DriverType			= irr::video::EDT_DIRECT3D9;
	m_IrrlichtCreationParameters.Fullscreen			= false;
	m_IrrlichtCreationParameters.HighPrecisionFPU	= true;
	m_IrrlichtCreationParameters.Stencilbuffer		= true;
	m_IrrlichtCreationParameters.WindowSize			= irr::core::dimension2di(800,600);

	irr::IrrlichtDevice			* m_Device			= irr::createDeviceEx(m_IrrlichtCreationParameters);
	irr::video::IVideoDriver	* m_Driver			= m_Device->getVideoDriver();
	irr::scene::ISceneManager	* m_SceneManager	= m_Device->getSceneManager();

	for( int x = 0 ; x != 10 ; x++)
		for( int y = 0 ; y != 10 ; y++)
			for( int z = 0 ; z != 10 ; z++)
				m_SceneManager->addCubeSceneNode(1, 0 , -1, irr::core::vector3df(x * 10 ,y* 10, z* 10));

	irr::scene::ICameraSceneNode * m_Camera = m_SceneManager->addCameraSceneNodeFPS(0, 40.f, 0.01f);
	m_Camera->setPosition(m_Camera->getPosition() + irr::core::vector3df(0,20,0));
   
	App::Engine::Culling::FrustrumCulling * m_FrustrumCulling = new App::Engine::Culling::FrustrumCulling(m_SceneManager);

	m_FrustrumCulling->Create();
	int __LastFPS = -1;

	while(m_Device->run())
	{
		if (m_Device->isWindowActive())
		{
			m_FrustrumCulling->Update();
			m_Driver->beginScene(true, true, irr::video::SColor(0,200,200,200));
			m_SceneManager->drawAll();
			m_Driver->endScene();
			
			int __Fps = m_Driver->getFPS();
			if (__LastFPS != __Fps)
			{
				core::stringw __Str;
				__Str += "FPS:";
				__Str += __Fps;
				m_Device->setWindowCaption(__Str.c_str());
				__LastFPS = __Fps;
			}

		}
	}
	delete m_FrustrumCulling;
	m_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
190 invités en ligne
membre en ligne: -
RSS Feed