1 Getting started 3 Hello Window - JJhuk/LearnOpenGL GitHub Wiki
LearnOpenGL - Hello Window
url: https://learnopengl.com/Getting-started/Hello-Window ์์ฑ์ผ: 2020๋ 12์ 21์ผ ์ค์ 2:14
GLFW๋ฅผ ์์ํ๊ณ ์คํํ ์ ์๋์ง ๋จผ์ ์ดํ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ .cpp
ํ์ผ์ ๋ง๋ค๊ณ ์๋ก ๋ง๋ ํ์ผ์ ๋งจ ์์ ๋ค์ include๋ค์ ์ถ๊ฐํฉ๋๋ค.
#include <glad/glad.h>
#include <GLFW/glfw3.h>
GLFW ์์ GLAD๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค. GLAD์ฉ ์ธํด๋ฃจ๋ ํ์ผ์๋ ์ฅ๋ฉด ๋ค์์ ํ์ํ OpenGL ํค๋(์๋ฅผ ๋ค๋ฉด GL/gl.h
) ๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก OpenGL (์๋ฅผ ๋ค์ด GLFW)์ด ํ์ํ ๋ค๋ฅธ ํค๋ ํ์ผ๋ณด๋ค GLAD๋ฅผ ํฌํจํด์ผ ํฉ๋๋ค.
๋ค์์ผ๋ก, GLFW์ฐฝ์ ์ธ์คํด์คํ ํ ์ฃผ์ ํจ์๋ฅผ ๋ง๋ญ๋๋ค.
int main()
{
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //์ฃผ ๋ฒ์
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); //๋ถ ๋ฒ์
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //Core-Profile
//glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); //Mac OS
return 0;
}
mainํจ์์์ ๋จผ์ glfwInit()
์ผ๋ก GLFW๋ฅผ ์ด๊ธฐํ ํ ๋ค์ glfwWindowHint
๋ฅผ ์ฌ์ฉํ์ฌ GLFW๋ฅผ ๊ตฌ์ฑํ ์ ์์๋๋ค. glfwWindowHint
์ ์ฒซ๋ฒ์งธ ์ธ์๋ ๊ตฌ์ฑํ๋ ค๋ ์ต์
์ ์๋ ค์ค๋๋ค. ์ฌ๊ธฐ์ GLFW_
์ ๋์ฌ๊ฐ ๋ถ์ ๊ฐ๋ฅํ ์ต์
์ ํฐ ์ด๊ฑฐ ํ์์ ์ต์
์ ์ ํํ ์ ์์ต๋๋ค. ๋๋ฒ์งธ ์ธ์๋ ์ต์
๊ฐ์ ์ค์ ํ๋ ํจ์์
๋๋ค. ๊ฐ๋ฅํ ๋ชจ๋ ์ต์
๋ฐ ํด๋นํ๋ ๊ฐ์ ๋ชฉ๋ก์ GLFW ์ฐฝ ์ฒ๋ฆฌ ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค. ์ง๊ธ ์์ฉํ๋ก๊ทธ๋จ์ ์คํํ๋ ค๊ณ ํ๋๋ฐ ์ ์๋์ง ์์ ๋ง์ ์ฐธ์กฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด GLFW ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์ฐ๊ฒฐํ์ง ์์ ๊ฒ์
๋๋ค.
์ด ์ฑ
์ ์ด์ ์ OpenGL ๋ฒ์ 3.3์ ์๊ธฐ ๋๋ฌธ์ GLFW์ ๋ฒ์ 3.3์ด ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ค๋ OpenGL ๋ฒ์ ์์ ์๋ ค์ผ ํฉ๋๋ค. ์ด๋ฐ ์์ผ๋ก GLFW๋ OpenGL ์ปจํ
์คํธ๋ฅผ ๋ง๋ค ๋ ์ ์ ํ ์ค๋น๋ฅผ ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์์๊ฒ ์ ์ ํ OpenGL ๋ฒ์ ์ด ์์ ๋ GLFW๊ฐ ์คํ๋์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฃผ ๋ฒ์ ๊ณผ ๋ถ ๋ฒ์ ์ ๋ชจ๋ 3.3์ผ๋ก ์ค์ ํ์ต๋๋ค. ๋ํ GLFW์ core-profile์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๊ณ ํ์ต๋๋ค. GLFW์ core-profile์ ์ฌ์ฉํ๊ณ ์ถ๋ค๊ณ ๋งํ๋ฉด ๋ ์ด์ ํ์ํ์ง ์์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๊ธฐ๋ฅ ์์ด OpenGL ๊ธฐ๋ฅ์ ๋ ์์ ์งํฉ์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. Mac OS X์์๋ ์ด๊ธฐํ ์ฝ๋์glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์์คํ /ํ๋์จ์ด์ OpenGL ๋ฒ์ 3.3 ์ด์์ด ์ค์น๋์ด ์๋์ง ํ์ธํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํ๊ฑฐ๋ ์ ์๋์ง ์์ ๋์์ด ํ์๋ฉ๋๋ค. ์ปดํจํฐ์์ OpenGL ๋ฒ์ ์ ์ฐพ์ผ๋ ค๋ฉด Linux ์ปดํจํฐ์์ glxinfo ๋ฅผ ํธ์ถํ๊ฑฐ๋ Windows์ ๊ฒฝ์ฐ OpenGL Extension Viewer ์ ๊ฐ์ ์ ํธ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ง์๋๋ ๋ฒ์ ์ด ๋ ๋ฎ์ผ๋ฉด ๋น๋์ค ์นด๋๊ฐ OpenGL 3.3+๋ฅผ ์ง์ํ๋์ง ํ์ธํ๊ณ (๊ทธ๋ ์ง ์์ผ๋ฉด ์ ๋ง ์ค๋๋ ๋ฒ์ ์ ๋๋ค.) ๋๋ผ์ด๋ฒ๋ฅผ ์ ๋ฐ์ดํธํ์ญ์์ค.
๋ค์์ผ๋ก ์ฐ๋ฆฌ๋ ์ฐฝ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด ์ฐฝ ๊ฐ์ฒด๋ ๋ชจ๋ ์ฐฝ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๋ฉฐ ๋๋ถ๋ถ์ GLFW์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํ์ํฉ๋๋ค
//800 600 "Learn OpenGL" ์ด๋ผ๋ ์ฐฝ์ ์๋์ฐ. ํจ์๊ฐ ๊ทธ ๊ฐ์ฒด๋ฅผ ๋ฐํํจ
GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", NULL, NULL);
if (window == NULL)
{
std::cout << "Failed to create GLFW window" << std::endl;
glfwTerminate(); //์ข
๋ฃ
return -1;
}
glfwMakeContextCurrent(window); //ํ์ฌ ์ค๋ ๋์ ๊ธฐ๋ณธ ์ปจํ
์คํธ
glfwCreateWindow ํจ์๋ ๊ฐ๊ฐ ์ฒ์ ๋๊ฐ์ ์ธ์๋ก ์ฐฝ ๋๋น์ ๋์ด๋ฅผ ํ์๋ก ํฉ๋๋ค. ์ธ๋ฒ์งธ ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ฐฝ์ ์ด๋ฆ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ง๊ธ์ "LearnOpenGL"
์ด๋ผ๊ณ ๋ถ๋ฅด์ง๋ง, ์ํ๋๋๋ก ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ง์ง๋ง 2๊ฐ์ ๋งค๊ฐ ๋ณ์๋ ๋ฌด์ํ ์ ์์ต๋๋ค. ์ด ํจ์๋ ๋์ค์ ๋ค๋ฅธ GLFW ์์
์ ํ์ํ GLFWwindow ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ ํ GLFW์๊ฒ ์ฐฝ์ ์ปจํ
์คํธ๋ฅผ ํ์ฌ ์ค๋ ๋์ ๊ธฐ๋ณธ ์ปจํ
์คํธ๋ก ๋ง๋ค๋๋ก ์ง์ํฉ๋๋ค.
GLAD
์ด์ ์ฑํฐ์์ GLAD๊ฐ OpenGL์ ์ฌ์ฉํ๊ธฐ ์ํ ํจ์ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํ๋ค๊ณ ๋งํ์ต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๋ OpenGL ํจ์๋ค์ ํธ์ถํ๊ธฐ ์ด์ ์ GLAD๋ฅผ ์ด๊ธฐํ ํ ๊ฒ์ ๋๋ค.
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
std::cout << "Failed to initialize GLAD" << std::endl;
return -1;
}
OS๋ณ OpenGL ํจ์ ํฌ์ธํฐ์ ์ฃผ์๋ฅผ ๋ก๋ ํ๋ ํจ์๋ฅผ GLAD์ ์ ๋ฌํฉ๋๋ค. GLFW๋ ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผ ํ๋ OS์ ๋ฐ๋ผ ์ฌ๋ฐ๋ฅธ ํจ์๋ฅผ ์ ์ํ๋ glfwGetProcAddress๋ฅผ ์ ๊ณตํฉ๋๋ค.
Viewport
๋ ๋๋ง์ ์์ํ๊ธฐ ์ ์ ๋ง์ง๋ง์ผ๋ก ํด์ผ ํ ์ผ์ด ์์๋๋ค. OpenGL์ด ์ฐฝ์ ๋ํ ๋ฐ์ดํฐ์ ์ขํ๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์๋๋ก ๋ ๋๋ง ์ฐฝ์ ํฌ๊ธฐ๋ฅผ OpenGL์ ์๋ ค์ผ ํฉ๋๋ค. glViewport ํจ์๋ฅผ ํตํด ์ด๋ฌํ ์น์๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
glViewport(0, 0, 800, 600);
glViewport์ ์ฒซ ๋ ์ธ์๋ ์ฐฝ์ ์ผ์ชฝ ํ๋จ ๋ชจ์๋ฆฌ์ ์์น๋ฅผ ์ค์ ํฉ๋๋ค. ์ธ ๋ฒ์งธ์ ๋ค ๋ฒ์งธ ๋งค๊ฐ ๋ณ์๋ ๋ ๋๋ง ์ฐฝ์ ๋๋น์ ๋์ด๋ฅผ ํฝ์ ๋จ์๋ก ์ค์ ํ๋ฉฐ GLFW์ ์ฐฝ ํฌ๊ธฐ์ ๋์ผํ๊ฒ ์ค์ ํฉ๋๋ค.
์ค์ ๋ก ๋ทฐํฌํธ์ ํฌ๊ธฐ๋ฅผ GLFW์ ํฌ๊ธฐ๋ณด๋ค ์์ ๊ฐ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ชจ๋ OpenGL ๋ ๋๋ง์ด ๋ ์์ ์ฐฝ์ ํ์๋๊ณ ์๋ฅผ ๋ค์ด OpenGL ๋ทฐํฌํธ ์ธ๋ถ์ ๋ค๋ฅธ ์์๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์ด ์ฌ ๋ค์ OpenGL์ glViewport๋ฅผ ํตํด ์ง์ ๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ 2D์ขํ๋ฅผ ํ๋ฉด์ ์ขํ๋ก ๋ณํํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฒ๋ฆฌ ๋ ์์น (-0.5,0.5)
๋ (์ต์ข
๋ณํ์ผ๋ก) ํ๋ฉด ์ขํ์์ (200, 450)
์ ๋งคํ๋ฉ๋๋ค. OpenGL์์ ์ฒ๋ฆฌ ๋ ์ขํ๋ -1๊ณผ 1 ์ฌ์ด์ด๋ฏ๋ก (-1 ~ 1) ์ด (0, 800)๊ณผ (0,600)๊น์ง์ ๋ฒ์๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋งคํํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ์ฐฝ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ์๊ฐ ๋ทฐํฌํธ๋ ์กฐ์ ๋์ด์ผ ํฉ๋๋ค. ์ฐฝ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋๋ง๋ค ํธ์ถ๋๋ ์ฐฝ์ ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค. ์ด ํฌ๊ธฐ ์กฐ์ ์ฝ๋ฐฑ ํจ์์๋ ๋ค์๊ณผ ๊ฐ์ ํ๋กํ ํ์ ์ด ์์ต๋๋ค.
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
ํ๋ ์ ๋ฒํผ ํฌ๊ธฐ ํจ์๋ GLFWwindow๋ฅผ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ฌ์ฉํ๊ณ , ์ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ๊ฐ์ ์ ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐฝ ํฌ๊ธฐ๊ฐ ๋ณ๊ฒฝ ๋ ๋๋ง๋ค GLFW๋ ์ด ํจ์๋ฅผ ํธ์ถํ๊ณ ์ฒ๋ฆฌ ํ ์ ์ ํ ์ธ์๋ฅผ ์ฑ์๋๋ค.
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
์ฐ๋ฆฌ๋ GLFW์ ๋ฑ๋กํ์ฌ ๋ชจ๋ ์ฐฝ ํฌ๊ธฐ ์กฐ์ ์์ ์ด ํจ์๋ฅผ ํธ์ถํ๊ธธ ์ํ๋ค๊ณ ์๋ ค์ผ ํฉ๋๋ค.
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
์ฐฝ์ด ์ฒ์ ํ์๋๋ฉด framebuffer_size_callback ์ด ๊ฒฐ๊ณผ ์ฐฝ ํฌ๊ธฐ์ ํจ๊ป ํธ์ถ๋ฉ๋๋ค. ๋ ํฐ๋ ๋์คํ๋ ์ด์ ๊ฒฝ์ฐ ๋๋น์ ๋์ด๋ ์๋ ์ ๋ ฅ ๊ฐ ๋ณด๋ค ํจ์ฌ ๋์์ง๋๋ค.
Ready your engines
์ ํ๋ฆฌ์ผ์ด์ ์ด ๋จ์ผ ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฐ ๋ค์ ์ฆ์ ์ข ๋ฃํ๊ณ ์ฐฝ์ ๋ซ๋ ๊ฒ์ ์ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ํ๋ก๊ทธ๋จ์ด ๋ช ์์ ์ผ๋ก ์ค์งํ๋ผ๋ ์ง์๋ฅผ ๋ฐ์ ๋๊น์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ฏธ์ง๋ฅผ ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ณ์ ์ฒ๋ฆฌํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ์ด๋ฐ ์ด์ ๋ก ์ฐ๋ฆฌ๋ GLFW์๊ฒ ์ค์งํ๋ผ๊ณ ๋งํ ๋๊น์ง ๊ณ์ ์คํ๋๋ ๋ ๋ ๋ฃจํ๋ผ๊ณ ๋ถ๋ฅด๋ while ๋ฃจํ๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๋ค์ ์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํ ๋ ๋๋ง ๋ฃจํ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
while(!glfwWindowShouldClose(window))
{
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwWindowShouldClose ํจ์๋ GLFW๊ฐ ๋ซํ๋๋ก ์ง์๋์๋์ง ๊ฐ ๋ฃจํ ๋ฐ๋ณต์ ์์์์ ํ์ธํฉ๋๋ค. ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ํจ์๋ true
๋ฅผ ๋ฐํํ๊ณ ๋ ๋๋ง ๋ฃจํ ์คํ์ด ์ค์ง ๋ ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ซ์ ์ ์์ต๋๋ค.
glfwPollEvents ํจ์๋ (ํค๋ณด๋ ์ ๋ ฅ ๋๋ ๋ง์ฐ์ค ์ด๋ ์ด๋ฒคํธ์ ๊ฐ์) ์ด๋ฒคํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋์๋์ง ํ์ธํ๊ณ ์ฐฝ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉฐ ํด๋น ํจ์๋ฅผ ํธ์ถํฉ๋๋ค (์ฝ๋ฐฑ ๋ฉ์๋๋ฅผ ํตํด ๋ฑ๋กํ ์ ์์). glfwSwapBuffers๋ ์ด ๋ ๋๋ง ๋ฐ๋ณต์ค์ ๋ ๋๋งํ๋๋ฐ ์ฌ์ฉ๋๋ ์์ ๋ฒํผ(GLFW ์ฐฝ์ ๊ฐ ํฝ์ ์ ๋ํ ์์ ๊ฐ์ ํฌํจํ๋ ํฐ 2D ๋ฒํผ)๋ฅผ ๊ณ ์ฒดํ๊ณ ํ๋ฉด์ ์ถ๋ ฅ์ผ๋ก ํ์ํฉ๋๋ค.
Double buffer ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋จ์ผ ๋ฒํผ์ ๊ทธ๋ฆด ๋ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง์ ๊น๋ฐ์ ๋ฌธ์ ๊ฐ ํ์๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ ์ด๋ฏธ์ง๊ฐ ์์๊ฐ์ ๊ทธ๋ ค์ง์ง ์๊ณ ํฝ์ ๋จ์๋ก ๊ทธ๋ ค์ง๊ธฐ ๋๋ฌธ์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก, ์์์ ์๋๋ก ๊ทธ๋ ค์ง๋๋ค. ์ด ์ด๋ฏธ์ง๋ ๋ ๋๋ง๋๋ ๋์ ์ฌ์ฉ์์๊ฒ ์ฆ์ ํ์๋์ง ์์ผ๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ํฐํฉํธ(๋์ ๋ณด์ผ ์ ๋๋ก ์ด์ํ๊ฑฐ)๊ฐ ํฌํจ๋ ์ ์์๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ์๋์ฐ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ ๋๋ง์ ์ด์ค ๋ฒํผ๋ฅผ ์ ์ฉํฉ๋๋ค. ํ๋ก ํธ ๋ฒํผ์๋ ํ๋ฉด์ ํ์๋๋ ์ต์ข ๊ฒฐ๊ณผ๋ง ๊ทธ๋ ค์ฃผ๊ณ , ๋ชจ๋ ๋ ๋๋ง ๋ช ๋ น์ ๋ฐฑ ๋ฒํผ๋ก ๊ทธ๋ ค์ง๋๋ค. ๋ชจ๋ ๋ ๋๋ง ๋ช ๋ น์ด ์๋ฃ ๋์๋ง์ ๋ฒก ๋ฒํผ๋ฅผ ํ๋ก ํธ ๋ฒํผ๋ก ๊ต์ฒดํ์ฌ ์ด๋ฏธ์ง๊ฐ ๋ ๋๋ง ๋์ง ์๊ณ ํ์๋ ์ ์๋๋ก ์์ ์ธ๊ธํ ๋ชจ๋ ์ํฐํฉํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
One last thing
๋ ๋๋ง ๋ฃจํ๋ฅผ ์ข ๋ฃํ์ ๋ง์ ํ ๋น ๋ ๋ชจ๋ GLFW ๋ฆฌ์์ค๋ฅผ ์ ์ ํ๊ฒ ์ ๋ฆฌ/์ญ์ ํด์ผ ํฉ๋๋ค. mainํจ์ ๋์์ ํธ์ถํ๋ glfwTerminateํจ์๋ฅผ ํตํด ์ด๋ฅผ ์ํํ ์ ์์ต๋๋ค.
glfwTerminate();
return 0;
์ด๋ ๊ฒ ํ๋ฉด ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ ๋ฆฌ๋๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ ๋๋ก ์ข ๋ฃ๋ฉ๋๋ค. ์ด์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ๊ณ ๋ชจ๋ ๊ฒ์ด ์๋๋ฉด ๋ค์ ํ๋ฉด์ ๋ณผ ์ ์์ต๋๋ค.
๋งค์ฐ ์ง๋ฃจํ๊ณ ์ง๋ฃจํ ๊ฒ์ ์ ์ด๋ฏธ์ง๋ผ๋ฉด ์ ๋๋ก ํ ๊ฒ์ ๋๋ค! ์ฌ๋ฐ๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ป์ง ๋ชปํ๊ฑฐ๋ ๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ ์กฐํ๋ฅผ ์ด๋ฃจ๋ ์ง ํผ๋์ค๋ฌ์ฐ๋ฉด ์ ์ฒด ์์ค ์ฝ๋๋ฅผ ํ์ธํ์ญ์์ค.
์์ฉ ํ๋ก๊ทธ๋จ์ ์ปดํ์ผํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋จผ์ ๋ชจ๋ ๋ง์ปค ์ต์ ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์๊ณ IDE์ ์ฌ๋ฐ๋ฅธ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ํฌํจํ๋์ง ํ์ธํ์ธ์(์ด์ ์ฅ์ ์์). ๋ํ ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅธ์ง ํ์ธํ์ธ์. ์ ์ฒด ์์ค ์ฝ๋์ ๋น๊ตํ์ฌ ํ์ธํ ์ ์์ต๋๋ค.
Input
๋ํ GLFW์์ ์ด๋ค ํํ์ ์ ๋ ฅ ์ ์ด๋ฅผ ์ํ๋ฉฐ GLFW์ ์ฌ๋ฌ ์ ๋ ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฐฝ์ ํค์ ํจ๊ป ์ ๋ ฅ์ผ๋ก ์ทจํ๋ GLFW์ glfwGetKEy ํจ์๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๋๋ค. ์ด ํจ์๋ ์ด ํค๊ฐ ํ์ฌ ๋๋ฌ์ ธ ์๋์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ชจ๋ ์ ๋ ฅ์ฝ๋๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ์ ์งํ๊ธฐ ์ํด processInput ํจ์๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค.
void processInput(GLFWwindow *window)
{
if(glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
์ฌ๊ธฐ์ ์ฌ์ฉ์๊ฐ ESC ํค๋ฅผ ๋๋ ๋์ง ํ์ธํฉ๋๋ค. (๋๋ฅด์ง ์์ผ๋ฉด glfwGetKey๋ GLFW_RELEASE๋ฅผ ๋ฐํํฉ๋๋ค) ์ฌ์ฉ์๊ฐ ESCํค๋ฅผ ๋๋ ๋ค๋ฉด glfwSetWindowShouldClose๋ฅผ ์ฌ์ฉํ์ฌ WindowShouldClose ์์ฑ์ true
๋ก ์ค์ ํ์ฌ GLFW๋ฅผ ๋ซ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฉ์ธ while
๋ฃจํ์ ๋ค์ ์กฐ๊ฑด ๊ฒ์ฌ๊ฐ ์คํจํ๊ณ ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ซํ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ ๋๋ง ๋ฃจํ๊ฐ ๋ฐ๋ณต ๋ ๋๋ง๋ค processInput์ ํธ์ถํฉ๋๋ค.
while (!glfwWindowShouldClose(window))
{
processInput(window);
glfwSwapBuffers(window);
glfwPollEvents();
}
์ด๋ฅผ ํตํด ํน์ ํค๊ฐ ๋๋ฌ์ก๋์ง ํ์ธํ๊ณ ๋ชจ๋ ํ๋ ์์ ๋ฐ๋ผ ๋ฐ์ํ ์ ์๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ ๋๋ง ๋ฃจํ์ ๋ฐ๋ณต์ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์์ด๋ผ๊ณ ๋ถ๋ฆฝ๋๋ค.
Rendering
๋ฃจํ์ ๊ฐ ๋ฐ๋ณต ๋๋ ํ๋ ์๋ง๋ค ๋ชจ๋ ๋ ๋๋ง ๋ช ๋ น์ ์คํํ๊ธฐ๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ ๋๋ง ๋ช ๋ น์ ๋ ๋๋ง ๋ฃจํ์ ๋ฐฐ์นํ๋ ค๊ณ ํฉ๋๋ค. ์ด๊ฒ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ผ๊ฒ๋๋ค.
// ๋ ๋๋ง ๋ฃจํ
while(!glfwWindowShouldClose(window))
{
// ์
๋ ฅ
processInput(window);
// ๋ ๋๋ง ์ปค๋งจ๋
...
// ์ด๋ฒคํธ๋ฅผ ์ฒดํฌํ๊ณ ํธ์ถํ๊ณ ๋ฒํผ๋ฅผ ๊ต์ฒดํฉ๋๋ค.
glfwPollEvents();
glfwSwapBuffers(window);
}
์ค์ ๋ก ์๋ํ๋์ง ํ
์คํธ ํ๊ธฐ ์ํด ์ ํํ ์์์ผ๋ก ํ๋ฉด์ ์ง์ฐ๊ณ ์ถ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ด์ ํ๋ ์์ ๊ฒฐ๊ณผ๊ฐ ๊ณ์ ํ์๋ฉ๋๋ค (์ํ๋ ํจ๊ณผ์ผ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ ์ง ์์ต๋๋ค.) glClear๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ์์ ๋ฒํผ๋ฅผ ์ง์ธ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฒํผ ๋นํธ๋ฅผ ์ ๋ฌํ์ฌ ์ง์ธ ๋ฒํผ๋ฅผ ์ง์ ํฉ๋๋ค. ์ค์ ํ ์ ์๋ ๋นํธ๋ GL_COLOR_BUFFER_BIT
, GL_DEPTH_BUFFER_BIT
๊ทธ๋ฆฌ๊ณ GL_STENCIL_BUFFER_BIT
์
๋๋ค. ์ง๊ธ์ ์์ ๊ฐ๋ง ๊ณ ๋ คํ๋ฏ๋ก ์์ ๋ฒํผ๋ฅผ ์ง์๋๋ค.
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glClearColor๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ์ง์ฐ๋ ์์์ ์ง์ ํฉ๋๋ค. glClear๋ฅผ ํธ์ถํ๊ณ ์์ ๋ฒํผ๋ฅผ ์ง์ธ ๋๋ง๋ค ์ ์ฒด ์์ ๋ฒํผ๊ฐ glClearColor์ ์ํด ๊ตฌ์ฑ๋ ์์์ผ๋ก ์ฑ์์ง๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ง์ ์ฒญ๋ก์์ด ๋ฉ๋๋ค.
OpenGL ์ฑํฐ์์ ๊ธฐ์ตํ ์ ์๋ฏ์ด glClearColor ํจ์๋ ์ํ์ง์ ํจ์์ด๊ณ glClear๋ ํ์ฌ ์ํ๋ฅผ ์ฌ์ฉํ์ฌ ํด๋ฆฌ์ด๋ง ์์์ ๊ฒ์ํ๋ค๋ ์ ์์ ์ํ์ฌ์ฉ ํจ์์ ๋๋ค.
์ ์ฒด ์์ค ์ฝ๋๋ ์ฌ๊ธฐ์์ ๋ณผ ์ ์์ต๋๋ค.
์ง๊ธ ์ฐ๋ฆฌ๋ ๋ค์์ฑํฐ๋ฅผ ์ํ ๋ง์ ๋ ๋๋ง ํธ์ถ๋ก ๋ ๋๋ง ๋ฃจํ๋ฅผ ์ฑ์ธ ๋ชจ๋ ์ค๋น๋ฅผ ๋ง์ณค์ต๋๋ค,