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);
};
์ด๋ฐ์์ผ๋ก ๊ตฌ์ฑ
๋น๋ ๋๋ง ์ค๋ธ์ ํธ ๋ก์ง
ํ๋ฉด์ ๋ ๋๋ง ๋์ง ์๋ ์ค๋ธ์ ํธ์ ๋ก์ง์ด ์ฒ๋ฆฌ๋ ์ ์์ด์ผ ํจ.
ํ์ฌ๋ ์ค๋ธ์ ํธ์ ์์ฑ๋ง ๊ฐ๋ฅํ ๋ฟ ๋ ๋๋ง ๋์ง ์๋ ์ค๋ธ์ ํธ์ ์ฝ๋๊ฐ ์๋ํ์ง ์์.
ํ๋ ์ ๋ณ ์ฝ๋ ์ฒ๋ฆฌ
ํ๋ฉด์ ๊ทธ๋ ค์ง์ง ์๋ ๊ฐ์ฒด๋ ๋งค ํ๋ ์ ์ฒ๋ฆฌ๋์ด์ผ ํ ์ฝ๋๊ฐ ์กด์ฌํ ์ ์๋ค.
์ด๋ฌํ ์ฝ๋๋ฅผ ์๋์ํค๊ธฐ ์ํด ๋ ๋๋ง๊ณผ ๋ณ๊ฐ๋ก 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;
}
์ฒ์์๋ ์ฝ๋๊ฐ ์ ๋ง ๋์กํ๊ณ ์ด๋ป๊ฒ ํด์ผํ ์ง ๋ชฐ๋์ง๋ง ํ๋์ฉ ์ฒ์ฒํ ํด๋ณด๋๊น ์์ฑ๋์์.
๊ฒ์์ ๋จ์ด์ง๋ ๊ณตํผํ๊ธฐ ๊ฒ์์ ๋ง๋ค์์