MY 3D_ARCHITECTURE_APPLICATION - wonjun7572/3D-Architecture-application GitHub Wiki

3D๊ฒŒ์ž„์•„ํ‚คํ…์ฒ˜์‘์šฉ

๊ธฐ์ดˆ ๊ตฌ์กฐ ์‹ค์Šต

๊ตฌ์กฐ

FileManager

ํŒŒ์ผ ๋กœ๋”ฉ ์ „์šฉ ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ํ…์Šค์ณ ๋ฐ obj ํŒŒ์ผ ๋กœ๋”ฉ ๋‹ด๋‹นํ•œ๋‹ค. ๋กœ๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋Š” Object๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

Object

๋กœ๋”ฉ๋œ ํŒŒ์ผ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

Renderer

Object์˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ™”๋ฉด์— ์ถœ๋ ฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.

์˜์‚ฌ์ฝ”๋“œ

int main()
{
	ํŒŒ์ผ๋งค๋‹ˆ์ € ๊ฐ์ฒด ์ƒ์„ฑ
	์˜ค๋ธŒ์ ํŠธ๊ฐ์ฒด cube ์ƒ์„ฑ
	์˜ค๋ธŒ์ ํŠธ๊ฐ์ฒด human ์ƒ์„ฑ
	์˜ค๋ธŒ์ ํŠธ cube ๊ฐ์ฒด์— ํŒŒ์ผ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ๋œ obj ํŒŒ์ผ ๋“ฑ์˜ ์ •๋ณด ์„ค์ •
	์˜ค๋ธŒ์ ํŠธ human ๊ฐ์ฒด์— ํŒŒ์ผ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ๋œ obj ํŒŒ์ผ ๋“ฑ์˜ ์ •๋ณด ์„ค์ •

	๋ Œ๋”๋Ÿฌ ๊ฐ์ฒด ์ƒ์„ฑ

	๋ฐ˜๋ณต
		๋ Œ๋”๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด cube draw
		๋ Œ๋”๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด human draw	
}

์ขŒํ‘œ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„(์นด๋ฉ”๋ผ ์‹œ์ , ์˜ค๋ธŒ์ ํŠธ ์œ„์น˜, ๊ฐ์ฒด๋“ค๋งˆ๋‹ค ๋ณ„๋„๋กœ.)

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

int main()
{
  FileManager* filemgr = FileManager::instance(); //ํŒŒ์ผ๋งค๋‹ˆ์ € ๊ฐ์ฒด ์ƒ์„ฑ

  RenderableObject* cube = new RenderableObject(); //์˜ค๋ธŒ์ ํŠธ๊ฐ์ฒด cube ์ƒ์„ฑ

  RenderableObject* human= new RenderableObject(); //์˜ค๋ธŒ์ ํŠธ๊ฐ์ฒด human ์ƒ์„ฑ

  filemgr->loadOBJ(		
		cube,					
                "cube.obj",			
		"uvtemplate.DDS",		
		"20161676_vs.shader",			
		"20161676_fs.shader"			
		); //์˜ค๋ธŒ์ ํŠธ cube ๊ฐ์ฒด์— ํŒŒ์ผ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ๋œ obj ํŒŒ์ผ ๋“ฑ์˜ ์ •๋ณด ์„ค์ •

  filemgr->loadOBJ(		
		human,					
                "human.obj",			
		"uvtemplate.DDS",		
		"20161676_vs.shader",			
		"20161676_fs.shader"			
		); //์˜ค๋ธŒ์ ํŠธ human ๊ฐ์ฒด์— ํŒŒ์ผ๋งค๋‹ˆ์ €๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ๋œ obj ํŒŒ์ผ ๋“ฑ์˜ ์ •๋ณด ์„ค์ •

 glm::mat4 ModelMatrix_Human = glm::mat4(1.0);	
 ModelMatrix_Human = glm::translate(ModelMatrix_Human, glm::vec3(3.0f, 0.0f, 0.0f)); //์ฝ”๋“œ์—์„  Sphere๋กœ ํ–ˆ์ง€๋งŒ ์—ฌ๊ธฐ์„  Human์œผ๋กœ ์ž‘์„ฑ
 
 glm::mat4 ModelMatrix_Cube = glm::mat4(1.0);
 ModelMatrix_Cube = glm::translate(ModelMatrix_Cube, glm::vec3(0.0f, 3.0f, 0.0f)); 
 // ์˜ค๋ธŒ์ ํŠธ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ ๋•Œ๋ฌธ์— ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ Main๋ฌธ์—์„œ ์™œ ์‚ฌ์šฉํ–ˆ์„๊นŒ ๋ฐ”๋ณด๊ฐ™์€ ์ƒ๊ฐ์ด์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

  while(true)
 {                                                               
  renderer->render(sphere, ModelMatrix_Human); //๋ Œ๋”๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด human draw		
  renderer->render(cube, ModelMatrix_Cube); //๋ Œ๋”๋Ÿฌ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด cube draw
 }
 
 ...
}

ํด๋ž˜์Šค ๊ตฌ์กฐ ์ถ”๊ฐ€

1. ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ธํ„ฐํŽ˜์ด์Šคํ™”

๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ.

๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์˜ ์ด๋ฆ„์ด ๋‹ฌ๋ผ์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋„๋ก ์–ต์ œํ•˜๋Š” ํšจ๊ณผ.

C++์—์„œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

class ICleanUp
{
public :
	virtual void shutDown() = 0;
};

class Object : public ICleanUp
{
public :
	virtual void shutDown() override
	{
		//  Object ์ •๋ฆฌ ์ฝ”๋“œ.
	}
};

class Renderer: public ICleanUp
{
public :
	virtual void shutDown() override
	{
		// renderer ์ •๋ฆฌ ์ฝ”๋“œ.
	}
};

2. ๊ธฐ๋Šฅ ๊ตฌ๋ถ„์„ ์œ„ํ•œ ์ƒ์†

์˜ˆ์‹œ - ํ™”๋ฉด์— ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š” Object ๊ธฐ๋Šฅ ์ถ”๊ฐ€.

ํ˜„์žฌ์˜ ๊ตฌ์กฐ์—์„œ Object๋Š” ๋ฌด์กฐ๊ฑด ํ™”๋ฉด์— ๋ณด์—ฌ์ง„๋‹ค๊ณ  ๊ฐ€์ •๋จ.

ํ™”๋ฉด์— ๋ณด์—ฌ์ง€์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” Object๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ๊ตฌ์กฐ.

๊ทธ๋ ค์ง€๋Š” Object, ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š” Object๋Š” ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅ.

render, update ๋ถ€๋ถ„์„ ์ธํ„ฐํŽ˜์ด์Šคํ™” ์‹œํ‚ด.

class IRender
{
public:
	virtual void render() = 0;
};
class IUpdate
{
public:
	virtual void update() = 0;
};

ํ™”๋ฉด์— ๋ณด์—ฌ์ง€์ง€ ์•Š๋Š” Object ํด๋ž˜์Šค.

class NonRenderableObject : public Object , public IUpdate
{	

 public:	
    virtual void shutDown() override;	   
   
};	

๊ตฌ ์ถœ๋ ฅ์šฉ ํด๋ž˜์Šค.

class Sphere : public RenderableObject
{	
  public:
	Sphere(FileManager* filepath);
	virtual void shutDown() override;
	virtual	void setPosition(float x, float y, float z);
};

์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ์„ฑ

6์ฃผ์ฐจ ๋‹ค์ด์–ด๊ทธ๋žจ

๋น„๋ Œ๋”๋ง ์˜ค๋ธŒ์ ํŠธ ๋กœ์ง

ํ™”๋ฉด์— ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ๋กœ์ง์ด ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.

ํ˜„์žฌ๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ์ƒ์„ฑ๋งŒ ๊ฐ€๋Šฅํ•  ๋ฟ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ.

ํ”„๋ ˆ์ž„ ๋ณ„ ์ฝ”๋“œ ์ฒ˜๋ฆฌ

ํ™”๋ฉด์— ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š” ๊ฐ์ฒด๋„ ๋งค ํ”„๋ ˆ์ž„ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘๋™์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ Œ๋”๋ง๊ณผ ๋ณ„๊ฐœ๋กœ Update๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ถ€๋ถ„์ด ํ•„์š”.

NonRenderableObject* non_render_obj = new NonRenderableObject();

while (true)
{
	renderer->update(sphere);
}

์˜ค๋ธŒ์ ํŠธ ๋ Œ๋”๋ง ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ๊ฐœ์„  ๋ฐ ๊ณตํ†ตํ•จ์ˆ˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ๊ฐœ์„ 

์ƒ์„ฑํ•œ ๋ชจ๋“  ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•ด ๋ชจ๋‘ render()๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๋†ํ›„ํ•จ.

์‹ค์ˆ˜๋กœ ์ž‘์„ฑํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๋Š” ๋ Œ๋”๋ง ๋˜์ง€ ์•Š์„ ๊ฒƒ.

๋ Œ๋”๋ง์„ ๋‹ด๋‹นํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์ฑ…์ž„์ง€๊ณ  ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Œ.

'๋ Œ๋”๋ง'๋งŒ ๋‹ด๋‹นํ•ด์ค€๋‹ค.

๊ฐ์ฒด์˜ ์ƒ์„ฑ๊ณผ ์†Œ๋ฉธ๊นŒ์ง€ ๋‹ด๋‹น์€ ํด๋ž˜์Šค์˜ ์—ญํ• ์„ ์˜ค๋ฒ„ํ•˜๊ฒŒ ๋จ.

๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ์˜ '์ •๋ฆฌ'๋Š” ๋‹ด๋‹นํ•ด์ฃผ์–ด๋„ ๋ฌธ์ œ ์—†์„ ๊ฒƒ.

๋ Œ๋”๋ง์— ๊ด€๋ จ๋œ ๋‚ด์šฉ์— ํ•œํ•˜์—ฌ.

RenderableObject* cube = new RenderableObject();
renderer->addObject(cube);

Sphere* sphere = new Sphere();
renderer->addObject(sphere);

while (true)
{
		renderer->render();
}

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

int main()
{	
		FileManager* filemgr = FileManager::instance();

			renderer->init();


			RenderableObject* cube = new RenderableObject();
			renderer->addObject(cube);


			filemgr->loadObJ(
				cube,
					"cube.obj",
				"uvtemplate.DDS",
					"20161676_vs.shader",
					"20161676_fs.shader"
				);

	//cube๋Š” RenderableObject ์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ๋•Œ๋ฌธ์— filemgr๋ฅผ ํ†ตํ•ด ๊ฐ€์ ธ์™€์ค˜์•ผํ•จ.

	Sphere* sphere = new Sphere(filemgr);
	renderer->addObject(sphere);

	//sphere๋Š” sphere ์ž์ฒด์—์„œ ๋ชจ๋“ ๊ฒƒ์„ ๊ด€๋ฆฌํ•จ.

	RenderableObject* cube1 = new RenderableObject();
	renderer->addObject(cube1);

	filemgr->loadObJ(
		cube1,
		"cube.obj",
		"uvtemplate.DDS",
		"20161676_vs.shader",
		"20161676_fs.shader"
	);

	Sphere* sphere1 = new Sphere(filemgr);
	renderer->addObject(sphere1);


	Sphere* sphere = new Sphere();		
        sphere->setPosition(-2.0f, 2.0f, 0.0f);
	sphere1->setPosition(2.0f, -2.0f, 0.0f);
	cube->setPosition(2.0f, 2.0f, 0.0f);
	cube1->setPosition(-2.0f, -2.0f, 0.0f);

	NonRenderableObject* non_render_obj = new NonRenderableObject();


while (true)
{
	renderer->Clear();

        renderer->render();
		
	renderer->update(non_render_obj);


	renderer->Out();
}
	cube->shutDown();
	sphere->shutDown();
	renderer->shutDown();
		
	delete cube;
	delete sphere;
	delete non_render_obj;


			return 0;
} 

์ค‘๊ฐ„

main๋ฌธ

int main()
{	
	FileManager* filemgr = FileManager::instance();
	Renderer* renderer = Renderer::instance();
	renderer->init();


	RenderableObject* ground = new RenderableObject();
	renderer->addObject(ground);


	filemgr->loadObJ(
		ground,
		"ground.obj",
		"skin.BMP",
		"20161676_vs.shader",
		"20161676_fs.shader"
		);


	Sphere* sun = new Sphere(filemgr);

	renderer->addObject(sun);
	
        RenderableObject* earth = new RenderableObject();
	renderer->addObject(earth);


	filemgr->loadObJ(
		earth,
		"orb.obj",
		"8k_earth.BMP",
		"20161676_vs.shader",
		"20161676_fs.shader"
		);


		RenderableObject* moon = new RenderableObject();
		renderer->addObject(moon);


		filemgr->loadObJ(
			moon,
			"orb.obj",
			"8k_moon.BMP",
		        "20161676_vs.shader",
		        "20161676_fs.shader"
	);


	sun->setPosition(-2.0f, 5.0f, 0.0f);
	earth->setPosition(2.0f, 5.0f, 0.0f);
	moon->setPosition(0.0f, 3.0f, 0.0f);
	ground->setPosition(0.0f, -10.0f, 0.0f);

	sun->setMoving(true);
	earth->setMoving(true);
	moon->setMoving(true);
	ground->setMoving(false);


	NonRenderableObject* non_render_obj = new NonRenderableObject();

        renderer->setCameraPos(0, 5, 13);	


	while (true)
	{
          renderer->Clear();
          renderer->update(non_render_obj);
          renderer->render();
	  renderer->Out();
	}
		
	sun->shutDown();
	renderer->shutDown();
	moon->shutDown();
	earth->shutDown();


	delete moon;
	delete earth;
	delete sun;
        delete non_render_obj;

	return 0;
}

์šฐ์„ ์ ์œผ๋กœ ๋ฐ‘์— ๊ทธ๋ผ์šด๋“œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ›„ moon, earth, sun์„ ๊ทธ๋ ค์ฃผ๊ณ  ๊ฐ์ฒด๋“ค์˜ ์ด๋™์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. setMoving์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์›€์ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ‚ค์ž…๋ ฅ๊ณผ ๋งˆ์šฐ์Šค์ž…๋ ฅ์„ ํ†ตํ•ด ๋งˆ์šฐ์Šค๋ฅผ ํ†ตํ•ด ์นด๋ฉ”๋ผ์˜ ์‹œ์ ์„ ๋ฐ”๊ฟ€์ˆ˜์žˆ๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ‚ค์ž…๋ ฅ ๋ถ€๋ถ„

KeyInput::instance()->horizontalAngle += KeyInput::instance()->mouseSpeed * float(1024 / 2 - xpos);
glm::mat4 ProjectionMatrix = KeyInput::instance()->getProjectionMatrix();
glm::mat4 ViewMatrix = KeyInput::instance()->getViewMatrix();
glm::mat4 ModelMatrix = glm::mat4(1.0);
ModelMatrix = getPosition(ModelMatrix, src_obj);
glm::mat4 Projection = glm::perspective(glm::radians(FoV), 4.0f / 3.0f, 0.1f, 100.0f); //๋งˆ์šฐ์Šค ์‹œ์ ๋ณ€ํ™˜๋ถ€๋ถ„
glm::vec3 direction(
cos(KeyInput::instance()->verticalAngle) * sin(KeyInput::instance()->horizontalAngle),
sin(KeyInput::instance()->verticalAngle),
cos(KeyInput::instance()->verticalAngle) * cos(KeyInput::instance()->horizontalAngle)
);
glm::vec3 right = glm::vec3(
sin(KeyInput::instance()->horizontalAngle - 3.14f / 2.0f),
0,
cos(KeyInput::instance()->horizontalAngle - 3.14f / 2.0f)
);
glm::vec3 position = glm::vec3(0, 0, 5);
glm::mat4 To_World = glm::mat4(1.0f);
glm::mat4 MVP;
if (src_obj->getMoving() == true)
{
MVP = ProjectionMatrix * moveCameraPos * ViewMatrix * moveObjPos * ModelMatrix;
}
else
{
MVP = Projection * moveCameraPos * View * moveObjPos * To_World;
}

//getmoving ์ด true์ด๋ฉด ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์„ ๋ฐ›์Œ main๋ฌธ์—์„œ setmoving์œผ๋กœ true,false ์ง€์ •ํ•ด์ฃผ๋ฉด๋จ.

๊ณ ์ •, ๊ฐ€๋ณ€ ํ”„๋ ˆ์ž„

๊ฐ€๋ณ€ ํ”„๋ ˆ์ž„

์ปดํ“จํ„ฐ์˜ ์„ฑ๋Šฅ์ด๋‚˜ ๊ธฐํƒ€ ํ•„์š”์— ๋”ฐ๋ผ ํ”„๋ ˆ์ž„์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๊ฒŒ์ž„์˜ ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ๊ฐ€๋ณ€ ํ”„๋ ˆ์ž„์ด๋ฉด ๋น ๋ฅธ ์ปดํ“จํ„ฐ์™€ ๋А๋ฆฐ ์ปดํ“จํ„ฐ์—์„œ์˜ ๊ฒŒ์ž„ ์ง„ํ–‰ ์†๋„๊ฐ€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ณ ์ • ํ”„๋ ˆ์ž„

ํ”„๋ ˆ์ž„์„ 1์ดˆ์— NํšŒ๋กœ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

๋ฌผ๋ฆฌ๋‚˜ ์„œ๋ฒ„, ๊ฒŒ์ž„๋กœ์ง ๋“ฑ์˜ ํŠน์ • ์‹œ์Šคํ…œ ๋ถ€๋ถ„์€ ์ปดํ“จํ„ฐ์— ์„ฑ๋Šฅ๊ณผ ์ƒ๊ด€์—†์ด ๋™์ผํ•˜๊ฒŒ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ณ ์ •ํ•˜๋Š” ํŽธ.

##Time๋ถ€๋ถ„

Time::Time()
{
	frame = 60;
	count = 0;
	QueryPerformanceFrequency(&_frameInfo);
	QueryPerformanceCounter(&_prevFrameCounter);

	// fps 60 = 1์ดˆ.
	_perFrame = (double)_frameInfo.QuadPart / frame;
	std::cout << _perFrame << std::endl;
}

bool Time::IsFixedRendering()
{
	QueryPerformanceCounter(&_nowFrameCounter);
	double time_distance = (double)_nowFrameCounter.QuadPart - (double)_prevFrameCounter.QuadPart;
	if (time_distance > _perFrame)
	{
		_prevFrameCounter = _nowFrameCounter;

		count++;
		if(frame == count)
		{
			std::cout << "1SECOND" << std::endl;	
			count = 0;
		}

		return true;
	}
	std::cout<<"Dis:"<<time_distance<<" Fps:" <<1/ (time_distance / (double)_frameInfo.QuadPart) << std::endl;
	return false;
} 

main๋ฌธ์—๋Š”

while(true)
{
   renderer->Clear();

   if (time->IsFixedRendering())
		{
			renderer->update(earth);
			renderer->update(moon);
			renderer->update(non_render_obj);
		}

   renderer->render();
}//์ด๋ ‡๊ฒŒ ์ถ”๊ฐ€ํ•ด์คŒ

์˜ค๋ธŒ์ ํŠธ ๊ตฌ์กฐ์— template์„ ์ ์šฉ.

๊ทธ๋ ค์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ, ๊ทธ๋ ค์ง€์ง€ ์•Š๋Š” ์˜ค๋ธŒ์ ํŠธ ๋ชจ๋‘ ํฌํ•จ.

template ํ•จ์ˆ˜

์˜ค๋ธŒ์ ํŠธ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ template

์˜ˆ: init()

์˜ค๋ธŒ์ ํŠธ ๋ Œ๋”๋ง์„ ์œ„ํ•จ.

์˜ˆ: render()

์˜ค๋ธŒ์ ํŠธ์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•จ.

์˜ˆ: update()

์˜ค๋ธŒ์ ํŠธ์˜ ์†Œ๋ฉธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•จ.

์˜ˆ: shutDown()

Init

class IInit
{
public:
	virtual void init() = 0;
};

Render

class IRender
{
public:
	virtual void render() = 0;
};

Update

class IUpdate
{
public:
	virtual void update() = 0;
};

Shutdown

class ICleanUp
{
public:
	virtual void shutDown() = 0;
};

Renderer์ชฝ iterator๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ”๊ฟ”์ฃผ๊ธฐ

void Renderer::addRenderObject(RenderableObject* obj)
{
	renderObjList.push_back(obj);
}

void Renderer::addNonRenderObject(NonRenderableObject* obj)
{
	nonrenderObjList.push_back(obj);
}

int Renderer::init()
{
	if (!glfwInit())
	{
		fprintf(stderr, "Failed to initialize GLFW\n");
		getchar();
		return -1;
	}

	glfwWindowHint(GLFW_SAMPLES, 4);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

	window = glfwCreateWindow(1024, 768, "20161676 Choi_Won_Jun", NULL, NULL);
	if (window == NULL) {
		fprintf(stderr, "Failed to open GLFW window. If you have an Intel GPU, they are not 3.3 compatible. Try the 2.1 version of the tutorials.\n");
		getchar();
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);

	glewExperimental = true;

	if (glewInit() != GLEW_OK) {
		fprintf(stderr, "Failed to initialize GLEW\n");
		getchar();
		glfwTerminate();
		return -1;
	}

	glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);

	glClearColor(0.0f, 0.0f, 0.4f, 0.0f);

	// depth test
	glEnable(GL_DEPTH_TEST);
	glDepthFunc(GL_LESS);

	for (std::vector<RenderableObject*>::iterator it = renderObjList.begin(); it != renderObjList.end(); it++)
	{
		(*it)->init();
	}

	for (std::vector<NonRenderableObject*>::iterator it = nonrenderObjList.begin(); it != nonrenderObjList.end(); it++)
	{
		(*it)->init();
	}

}

void Renderer::render()
{
	for (std::vector<RenderableObject*>::iterator it = renderObjList.begin(); it != renderObjList.end(); it++)
	{
		(*it)->render();
	}

	for (std::vector<NonRenderableObject*>::iterator it = nonrenderObjList.begin(); it != nonrenderObjList.end(); it++)
	{
		(*it)->render();
	}
}

void Renderer::shutDown()
{
	glfwTerminate();
	for (std::vector<RenderableObject*>::iterator it = renderObjList.begin(); it != renderObjList.end(); it++)
	{
		(*it)->shutDown();
	}

	for (std::vector<NonRenderableObject*>::iterator it = nonrenderObjList.begin(); it != nonrenderObjList.end(); it++)
	{
		(*it)->shutDown();
	}
}

void Renderer::update()
{
	for (std::vector<RenderableObject*>::iterator it = renderObjList.begin(); it != renderObjList.end(); it++)
	{
		(*it)->update();
	}

	for (std::vector<NonRenderableObject*>::iterator it = nonrenderObjList.begin(); it != nonrenderObjList.end(); it++)
	{
		(*it)->update();
	}
}


void Renderer::Clear()
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}

void Renderer::Out()
{
	if (glfwGetKey(window , GLFW_KEY_ESCAPE) == GLFW_PRESS)
	{
		exit(0);
	}
	glfwSwapBuffers(window);
	glfwPollEvents();
}

๊น”๋”ํ•˜๊ฒŒ ๋ณ€ํ•œ main๋ฌธ

int main()
{
	FileManager* filemgr = FileManager::instance();

	Time* time = Time::instance();
	Renderer* renderer = Renderer::instance();

	RenderableObject* render_obj = new RenderableObject();
	NonRenderableObject* non_render_obj = new NonRenderableObject();

	Sun* sun = new Sun();

	renderer->init();

	while (true)
	{
		renderer->Clear();

		if (time->IsFixedRendering())
		{
			renderer->update();
		}

		renderer->render();

		renderer->Out();
	}


	renderer->shutDown();


	delete sun;
	delete non_render_obj;

	return 0;
}

์ฒ˜์Œ์—๋Š” ์ฝ”๋“œ๊ฐ€ ์ •๋ง ๋‚œ์žกํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ์ง€ ๋ชฐ๋ž์ง€๋งŒ ํ•˜๋‚˜์”ฉ ์ฒœ์ฒœํžˆ ํ•ด๋ณด๋‹ˆ๊นŒ ์™„์„ฑ๋˜์—ˆ์Œ.

๊ฒŒ์ž„์€ ๋–จ์–ด์ง€๋Š” ๊ณตํ”ผํ•˜๊ธฐ ๊ฒŒ์ž„์„ ๋งŒ๋“ค์˜ˆ์ •