Vertext input
๋ฌด์์ธ๊ฐ๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด์๋ ์ฐ์ OpenGL์ ์ ๋ ฅ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
OepnGl์ 3D๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ฏ๋ก ๋ชจ๋ ์ขํ๋ 3D(์ฆ, x, y, z)์ ๋๋ค.
OpenGL์ ๋จ์ํ ๋ชจ๋ 3D์ขํ๋ฅผ ํ๋ฉด์ 2Dํฝ์ ๋ก ๋ณํํ์ง ์์ต๋๋ค.
OpenGL์ 3D์ขํ๊ฐ ๋ชจ๋ 3์ถ์์ -1.0๊ณผ 1.0 ์ฌ์ด์ ํน์ ๋ฒ์์ ์์ ๋๋ง ์ฒ๋ฆฌํฉ๋๋ค.
์ด๋ ๊ฒ Normilized device coordinates๋ ํ๋ฉด์ ํ์๋ฉ๋๋ค.(์ด ๋ฒ์ ๋ฐ์ ๋ชจ๋ ์ขํ๋ ํ์๋์ง ์์ต๋๋ค)
๋จ์ผ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ณ ์ ํ๋ฏ๋ก ์ด ์ธ ๊ฐ์ ์ ์ ์ ์ง์ ํ๋ ค๊ณ ํฉ๋๋ค.
๊ฐ ์ ์ ์ 3D์์น๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ๋ค์ OpenGL์ ๊ฐ์์์ญ์ธ Normilized device coordinates๋ก ์ ์ํฉ๋๋ค.
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
};
OpenGL์ 3D ๊ณต๊ฐ์์ ์๋ํ๊ธฐ ๋๋ฌธ์ ๊ฐ ์ ์ ์ด z ์ขํ๋ฅผ 0.0์ผ๋ก ๊ฐ๋ 2D ์ผ๊ฐํ์ ๋ ๋๋งํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์ผ๊ฐํ์ ๊น์ด๊ฐ ๋์ผํ๊ฒ ์ ์ง๋์ด 2D์ฒ๋ผ ๋ณด์ ๋๋ค.
Normilized device coordinates(NDC)
vertex shader์์ ์ ์ ์ขํ๊ฐ ์ฒ๋ฆฌ๋ ํ, ๊ทธ๊ฒ๋ค์ x, y, z ๊ฐ์ด -1.0 ์์ 1.0๊น์ง ๋ณํ๋ ์์ ๊ณต๊ฐ์ธ
ndc์ ์์ด์ผ ํฉ๋๋ค.
์ด ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ขํ๋ ๋ฒ๋ ค์ง๊ฑฐ๋ ํด๋ฆฌํ๋์ด ํ๋ฉด์ ํ์๋์ง ์์ต๋๋ค.
์๋๋ z์ถ์ ๋ฌด์ํ ndc ๋ด์ ์ง์ ๋ ์ผ๊ฐํ์ ๋ณผ ์ ์์ต๋๋ค.

NDC์ขํ๋ glViewport์์ ์ ๊ณตํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐํฌํธ ๋ณํ์ ํตํด ํ๋ฉด ๊ณต๊ฐ ์ขํ๋ก ๋ณํ ๋ฉ๋๋ค.
๊ทธ ๊ฒฐ๊ณผ ํ๋ฉด ๊ณต๊ฐ ์ขํ๋ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ ์ ๋ ฅ์ผ๋ก ๋ณํ ๋ฉ๋๋ค.
์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ ํ, ์ด๋ฅผ ๊ทธ๋ํฝ ํ์ดํ๋ผ์ธ์ ์ฒซ ๋ฒ์งธ ๊ณผ์ ์ธ ์ ์ ์ ฐ์ด๋์ ์ ๋ ฅ์ผ๋ก ๋ณด๋ด๊ณ ์ ํฉ๋๋ค.
์ด๋ GPU์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ฑํ๊ณ , OpenGL์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ํ๋ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ํฝ ์นด๋๋ก ๋ณด๋ด๋ ๋ฐฉ๋ฒ์ ์ง์ ํจ์ผ๋ก์จ ์ํ๋ฉ๋๋ค.
์ ์ ์ ฐ์ด๋๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ๋ฆฌ๊ฐ ์ง์ํ ๋งํผ์ ์ ์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
์ด ๋ฉ๋ชจ๋ฆฌ๋ ์์ ์ ์ ๋ฒํผ ๊ฐ์ฒด(VBO)๋ฅผ ํตํด ๊ด๋ฆฌ๋ฉ๋๋ค.
VBO๋ GPU์ ๋ฉ๋ชจ๋ฆฌ์ ๋ง์ ์์ ์ ์ ์ ์ ์ฅํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฒํผ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฅ์ ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๊ทธ๋ํฝ ์นด๋๋ก ๋ณด๋ผ ์ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ๋ค๋ฉด ๊ทธ๊ณณ์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
ํ ๋ฒ์ ํ ์ ์ ์ฉ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํจ์จ์ ์ ๋๋ค. CPU์์ ๊ทธ๋ํฝ ์นด๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ์๋์ ์ผ๋ก ๋๋ฆฌ๊ธฐ ๋๋ฌธ์, ๊ฐ๋ฅํ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ณด๋ด๋ ค๊ณ ํฉ๋๋ค.
๋ฐ์ดํฐ๊ฐ ๊ทธ๋ํฝ ์นด๋์ ๋ฉ๋ชจ๋ฆฌ์ ์์ผ๋ฉด ์ ์ ์ ฐ์ด๋๋ ์ ์ ์ ๊ฑฐ์ ์ฆ๊ฐ์ ์ผ๋ก ์ ๊ทผํ ์ ์์ด ๋งค์ฐ ๋น ๋ฆ ๋๋ค.
์ ์ ๋ฒํผ ๊ฐ์ฒด๋ OpenGL ์ฅ์์ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด OpenGL ๊ฐ์ฒด์ ์ฒซ ๋ฒ์งธ ์์ ๋๋ค.
OpenGL์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด ๋ฒํผ์๋ ํด๋น ๋ฒํผ์ ๋์ํ๋ ๊ณ ์ ID๊ฐ ์์ผ๋ฏ๋ก glGenBuffers ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ ID๋ฅผ ์์ฑํ ์ ์์ต๋๋ค
unsigned int VBO;
glGenBuffers(1, &VBO);
OpenGL์๋ ๋ง์ ์ข ๋ฅ์ ๋ฒํผ ๊ฐ์ฒด๊ฐ ์์ผ๋ฉฐ, ์ ์ ๋ฒํผ ๊ฐ์ฒด์ ๋ฒํผ ํ์ ์ GL_ARRAY_BUFFER์ ๋๋ค.
OpenGL์ ๋ค๋ฅธ ๋ฒํผ ํ์ ์ ๊ฐ์ง ์ฌ๋ฌ ๋ฒํผ์ ๋์์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค. glBindBuffer ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ์์ฑ๋ ๋ฒํผ๋ฅผ GL_ARRAY_BUFFER ํ๊ฒ์ ๋ฐ์ธ๋ฉํ ์ ์์ต๋๋ค
glBindBuffer(GL_ARRAY_BUFFER, VBO);
๊ทธ ์์ ๋ถํฐ ์ฐ๋ฆฌ๊ฐ ๋ง๋๋ ๋ชจ๋ ๋ฒํผ ํธ์ถ(GL_ARRAY_BUFFER ํ๊ฒ์์)์ ํ์ฌ ๋ฐ์ธ๋ฉ๋ ๋ฒํผ, ์ฆ VBO๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ glBufferData ํจ์๋ฅผ ํธ์ถํ์ฌ ์ด์ ์ ์ ์๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฒํผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ณต์ฌํ ์ ์์ต๋๋ค
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBufferData๋ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํ์ฌ ๋ฐ์ธ๋ฉ๋ ๋ฒํผ์ ๋ณต์ฌํ๋ ๋ฐ ํน๋ณํ ๋ชฉ์ ์ ๋ ํจ์์ ๋๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ ค๋ ๋ฒํผ ํ์ ์ผ๋ก, ํ์ฌ GL_ARRAY_BUFFER ํ๊ฒ์ ๋ฐ์ธ๋ฉ๋ ์ ์ ๋ฒํผ ๊ฐ์ฒด์ ๋๋ค.
๋ ๋ฒ์งธ ์ธ์๋ ๋ฒํผ์ ์ ๋ฌํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ํฌ๊ธฐ(๋ฐ์ดํธ ๋จ์)๋ฅผ ์ง์ ํ๋ฉฐ, ์ ์ ๋ฐ์ดํฐ์ ๋จ์ํ sizeof๋ก ์ถฉ๋ถํฉ๋๋ค.
์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ ์กํ๊ณ ์ ํ๋ ์ค์ ๋ฐ์ดํฐ์ ๋๋ค.
๋ค ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ๊ทธ๋ํฝ ์นด๋๊ฐ ์ ๊ณต๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ์ง๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ ์ธ ๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค:
- GL_STREAM_DRAW: ๋ฐ์ดํฐ๋ ํ ๋ฒ๋ง ์ค์ ๋๊ณ GPU์์ ๋ช ๋ฒ ์ฌ์ฉ๋ฉ๋๋ค.
- GL_STATIC_DRAW: ๋ฐ์ดํฐ๋ ํ ๋ฒ๋ง ์ค์ ๋๊ณ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋ฉ๋๋ค.
- GL_DYNAMIC_DRAW: ๋ฐ์ดํฐ๋ ์์ฃผ ๋ณ๊ฒฝ๋๊ณ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉ๋ฉ๋๋ค.
์ผ๊ฐํ์ ์์น ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ๋์ง ์๊ณ , ๋ง์ด ์ฌ์ฉ๋๋ฉฐ, ๋ชจ๋ ๋ ๋๋ง ํธ์ถ์ ๋ํด ๋์ผํ๋ฏ๋ก ์ฌ์ฉ ์ ํ์ GL_STATIC_DRAW๊ฐ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์์ฃผ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ฒํผ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, GL_DYNAMIC_DRAW ์ฌ์ฉ ์ ํ์ ๊ทธ๋ํฝ ์นด๋๊ฐ ๋ ๋น ๋ฅธ ์ฐ๊ธฐ๋ฅผ ์ํด ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐฐ์นํ๋๋ก ํฉ๋๋ค.
Vertext Shader
์ ์ ์ ฐ์ด๋๋ ์ฐ๋ฆฌ ๊ฐ์ ์ฌ๋๋ค์ด ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ ์ ฐ์ด๋ ์ค ํ๋์ ๋๋ค.
ํ๋ OpenGL์์๋ ๋ ๋๋ง์ ์ํํ๋ ค๋ฉด ์ต์ํ ์ ์ ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ ฐ์ด๋๋ฅผ ๊ฐ๋ตํ ์๊ฐํ๊ณ ์ฒซ ๋ฒ์งธ ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๊ธฐ ์ํด ๋ ๊ฐ์ ๋งค์ฐ ๊ฐ๋จํ ์ ฐ์ด๋๋ฅผ ๊ตฌ์ฑํ ๊ฒ์ ๋๋ค.
๋ค์ ์ฅ์์๋ ์ ฐ์ด๋์ ๋ํด ๋ ์์ธํ ๋ ผ์ํ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ฒซ ๋ฒ์งธ ์ผ์ ์ ฐ์ด๋ ์ธ์ด GLSL(OpenGL Shading Language)๋ก ์ ์ ์ ฐ์ด๋๋ฅผ ์์ฑํ๊ณ ,
์ด ์ ฐ์ด๋๋ฅผ ์ปดํ์ผํ์ฌ ์ฐ๋ฆฌ์ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์๋๋ GLSL๋ก ์์ฑ๋ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ์ ์ ์ ฐ์ด๋์ ์์ค ์ฝ๋์ ๋๋ค:
#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
๋ณด์๋ค์ํผ, GLSL์ C ์ธ์ด์ ์ ์ฌํฉ๋๋ค. ๊ฐ ์ ฐ์ด๋๋ ๋ฒ์ ์ ์ธ์ผ๋ก ์์๋ฉ๋๋ค.
OpenGL 3.3 ์ด์์์๋ GLSL์ ๋ฒ์ ๋ฒํธ๊ฐ OpenGL์ ๋ฒ์ ๊ณผ ์ผ์นํฉ๋๋ค (์๋ฅผ ๋ค์ด, GLSL ๋ฒ์ 420์ OpenGL ๋ฒ์ 4.2์ ํด๋นํฉ๋๋ค).
๋ํ ์ฐ๋ฆฌ๊ฐ ์ฝ์ด ํ๋กํ์ผ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ณ ์๋ค๋ ๊ฒ์ ๋ช ์์ ์ผ๋ก ์ธ๊ธํฉ๋๋ค.
๋ค์์ผ๋ก๋ in ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ์ ฐ์ด๋์ ๋ชจ๋ ์ ๋ ฅ ์ ์ ์์ฑ์ ์ ์ธํฉ๋๋ค.
์ง๊ธ์ ์์น ๋ฐ์ดํฐ์๋ง ๊ด์ฌ์ด ์์ผ๋ฏ๋ก ๋จ์ผ ์ ์ ์์ฑ๋ง ํ์ํฉ๋๋ค.
GLSL์๋ ํฌ์คํธํฝ์ค ์ซ์์ ๋ฐ๋ผ 1์์ 4๊ฐ์ float๋ฅผ ํฌํจํ๋ ๋ฒกํฐ ๋ฐ์ดํฐ ์ ํ์ด ์์ต๋๋ค.
๊ฐ ์ ์ ์ด 3D ์ขํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก aPos๋ผ๋ ์ด๋ฆ์ vec3 ์ ๋ ฅ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค.
๋ํ layout (location = 0)์ ํตํด ์ ๋ ฅ ๋ณ์์ ์์น๋ฅผ ํน๋ณํ ์ค์ ํฉ๋๋ค. ๋์ค์ ์ด ์์น๊ฐ ์ ํ์ํ์ง ๋ณด๊ฒ ๋ ๊ฒ์ ๋๋ค.
Vector
๊ทธ๋ํฝ ํ๋ก๊ทธ๋๋ฐ์์๋ ๊ณต๊ฐ ๋ด์์ ์์น๋ ๋ฐฉํฅ์ ํํํ๋ ๋ฐ์ ์ ์ฉํ ์ํ์ ํน์ฑ์ ๊ฐ๊ณ ์๋ ์ํ์ ๊ฐ๋ ์ธ ๋ฒกํฐ๋ฅผ ์์ฃผ ์ฌ์ฉํฉ๋๋ค.
GLSL์์ ๋ฒกํฐ๋ ์ต๋ ํฌ๊ธฐ๊ฐ 4์ด๋ฉฐ, ๊ฐ๊ฐ์ ๊ฐ์ vec.x, vec.y, vec.z, vec.w๋ฅผ ํตํด ๊ฐ๊ฐ ๊ฒ์ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ๊ฐ๊ฐ์ ๊ณต๊ฐ์์์ ์ขํ๋ฅผ ๋ํ๋ ๋๋ค. vec.w ๊ตฌ์ฑ ์์๋ ๊ณต๊ฐ์์์ ์์น๋ก ์ฌ์ฉ๋์ง ์์ต๋๋ค(์ฐ๋ฆฌ๋ 3D๋ฅผ ๋ค๋ฃจ๊ณ ์์ง, 4D๊ฐ ์๋๋๋ค) ํ์ง๋ง perspective division์ด๋ผ๋ ๊ฒ์ ์ฌ์ฉ๋ฉ๋๋ค.
๋ฒกํฐ์ ๋ํด ๋ ๊น์ด ๋ ผ์ํ ์์ ์ ๋๋ค.
์ ์ ์์ด๋์ ์ถ๋ ฅ์ ์ค์ ํ๋ ค๋ฉด vec4์ธ ์์น ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์๋ gl_Position์ ํ ๋นํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ gl_Position์ ์ค์ ํ ๊ฒ์ด ์ ์ ์์ด๋์ ์ถ๋ ฅ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ฌ ์ ์ ์์ด๋๋ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ํ ์ฒ๋ฆฌํ์ง ์๊ณ ๋จ์ํ ์์ด๋์ ์ถ๋ ฅ์ผ๋ก ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
์ค์ ์ดํ๋ฆฌ์ผ์ด์ ์์๋ ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ๋ณดํต ์ด๋ฏธ ์ ๊ทํ๋ device ์ขํ์ ์์ง ์๊ธฐ ๋๋ฌธ์
๋จผ์ OpenGL์ ๊ฐ์ ์์ญ ๋ด์ ๋ค์ด๊ฐ๋ ์ขํ๋ก ๋ณํํด์ผ ํฉ๋๋ค.
Compiling a shader
์ฝ๋ ํ์ผ ์๋จ์ ์ ์ ์์ด๋์ ์์ค ์ฝ๋๋ฅผ const C ๋ฌธ์์ด๋ก ์ ์ฅํฉ๋๋ค.
const char *vertexShaderSource = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
"}\0";
OpenGL์ด ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์์ค ์ฝ๋์์ ์คํ ์๊ฐ์ ๋์ ์ผ๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ฒซ ๋ฒ์งธ ์ผ์ ID๋ก ์ฐธ์กฐ๋๋ ์ ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ ์ ์ ฐ์ด๋๋ฅผ unsigned int๋ก ์ ์ฅํ๊ณ glCreateShader๋ก ์ ฐ์ด๋๋ฅผ ์์ฑํฉ๋๋ค
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glCreateShader์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ๊ณ ์ ํ๋ ์ ฐ์ด๋์ ์ ํ์ ์ธ์๋ก ์ ๊ณตํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ ์ ฐ์ด๋๋ฅผ ์์ฑํ๊ณ ์์ผ๋ฏ๋ก GL_VERTEX_SHADER๋ฅผ ์ ๋ฌํฉ๋๋ค.
๋ค์์ผ๋ก ์ ฐ์ด๋ ์์ค ์ฝ๋๋ฅผ ์ ฐ์ด๋ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ๊ณ ์ ฐ์ด๋๋ฅผ ์ปดํ์ผํฉ๋๋ค
glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
glCompileShader(vertexShader);
glShaderSource ํจ์๋ ์ฒซ ๋ฒ์งธ ์ธ์๋ก ์ปดํ์ผํ ์ ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ต๋๋ค.
๋ ๋ฒ์งธ ์ธ์๋ ์์ค ์ฝ๋๋ก ์ ๋ฌํ๋ ๋ฌธ์์ด์ ์๋ฅผ ์ง์ ํ๋๋ฐ, ์ด ๊ฒฝ์ฐ๋ ํ๋์ ๋๋ค.
์ธ ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ ์ ์ ์ ฐ์ด๋์ ์ค์ ์์ค ์ฝ๋์ด๋ฉฐ,
๋ค ๋ฒ์งธ ๋งค๊ฐ๋ณ์๋ NULL๋ก ๋ ์ ์์ต๋๋ค.
์ปดํ์ผ ํ์ glCompileShader ํธ์ถ์ด ์ฑ๊ณต์ ์ด์๋์ง, ๊ทธ๋ฆฌ๊ณ ์คํจํ ๊ฒฝ์ฐ ์ด๋ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ปดํ์ผ ์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
int success;
char infoLog[512];
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
๋จผ์ ์ฑ๊ณต์ ๋ํ๋ด๋ ์ ์์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ์ฅํ ์ปจํ ์ด๋๋ฅผ ์ ์ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ glGetShaderiv๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผ์ด ์ฑ๊ณต์ ์ด์๋์ง ํ์ธํฉ๋๋ค.
์ปดํ์ผ์ ์คํจํ ๊ฒฝ์ฐ glGetShaderInfoLog๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๊ฒ์ํ๊ณ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํด์ผ ํฉ๋๋ค.
if(!success)
{
glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
}
์ ์ ์ ฐ์ด๋ ์ปดํ์ผ ์ค ์ค๋ฅ๊ฐ ๊ฐ์ง๋์ง ์์๋ค๋ฉด, ์ด์ ์ปดํ์ผ์ด ์๋ฃ๋์์ต๋๋ค.
Fragment shader
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ์ผ๊ฐํ์ ๋ ๋๋งํ๊ธฐ ์ํด ์์ฑํ ๋ ๋ฒ์งธ์ด์ ๋ง์ง๋ง ์ ฐ์ด๋์ ๋๋ค.
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ํฝ์ ์ ์์ ์ถ๋ ฅ์ ๊ณ์ฐํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ๊ฐ๋จํ๊ฒ ์ ์งํ๊ธฐ ์ํด ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ํญ์ ์ค๋ ์ง์ ๊ณ์ด์ ์์์ ์ถ๋ ฅํ ๊ฒ์ ๋๋ค.
์ปดํจํฐ ๊ทธ๋ํฝ์์ ์์์ ๋นจ๊ฐ์, ๋ น์, ํ๋์ ๋ฐ ์ํ(๋ถํฌ๋ช ๋) ์ฑ๋ถ์ 4๊ฐ์ง ๊ฐ ๋ฐฐ์ด๋ก ํํ๋ฉ๋๋ค.
์ด๋ ์ผ๋ฐ์ ์ผ๋ก RGBA๋ก ์ฝ์นญ๋ฉ๋๋ค. OpenGL์ด๋ GLSL์์ ์์์ ์ ์ํ ๋ ๊ฐ ์ฑ๋ถ์ ๊ฐ๋๋ฅผ 0.0์์ 1.0 ์ฌ์ด์ ๊ฐ์ผ๋ก ์ค์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋นจ๊ฐ์์ 1.0, ๋ น์์ 1.0์ผ๋ก ์ค์ ํ๋ฉด ๋ ์์์ด ํผํฉ๋์ด ๋ ธ๋์์ด ๋ฉ๋๋ค. ์ด ์ธ ๊ฐ์ง ์์ ์ฑ๋ถ์ ์ฌ์ฉํ์ฌ 1600๋ง ๊ฐ์ง ์ด์์ ๋ค์ํ ์์์ ์์ฑํ ์ ์์ต๋๋ค!
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ๋จ ํ๋์ ์ถ๋ ฅ ๋ณ์๋ง ํ์ํ๋ฉฐ, ์ด๋ ์ต์ข ์์ ์ถ๋ ฅ์ ์ ์ํ๋ 4์ฐจ์ ๋ฒกํฐ์ ๋๋ค.
์ฐ๋ฆฌ๋ out ํค์๋๋ก ์ถ๋ ฅ ๊ฐ์ ์ ์ธํ ์ ์์ผ๋ฉฐ, ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ FragColor๋ผ๊ณ ์ ์ ํ ์ด๋ฆ์ ์ง์์ต๋๋ค. ๋ค์์ผ๋ก, ์ฐ๋ฆฌ๋ ์์ ํ ๋ถํฌ๋ช ํ ์ํ ๊ฐ(1.0)์ ๊ฐ์ง ์ค๋ ์ง์์ผ๋ก vec4๋ฅผ ์์ ์ถ๋ ฅ์ ํ ๋นํฉ๋๋ค.
ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ฅผ ์ปดํ์ผํ๋ ๊ณผ์ ์ ์ ์ ์ ฐ์ด๋์ ์ ์ฌํ์ง๋ง, ์ด๋ฒ์๋ ์ ฐ์ด๋ ์ ํ์ผ๋ก GL_FRAGMENT_SHADER ์์๋ฅผ ์ฌ์ฉํฉ๋๋ค
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
glCompileShader(fragmentShader);
์ด์ ๋ ์ ฐ์ด๋ ๋ชจ๋ ์ปดํ์ผ๋์๊ณ , ๋จ์ ์ผ์ ๋ ์ ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ํ๋์ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค. ์ด ํ๋ก๊ทธ๋จ์ ๋ ๋๋ง์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์์๋ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ํ์ธํ๋ ๊ฒ์ ์์ง ๋ง์ธ์!
Shader Program
์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ ์ฌ๋ฌ ์ ฐ์ด๋๊ฐ ๊ฒฐํฉ๋ ์ต์ข ์ฐ๊ฒฐ ๋ฒ์ ์ ๋๋ค.
์ต๊ทผ์ ์ปดํ์ผ๋ ์ ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ์ฐ๊ฒฐํ๊ณ ๊ฐ์ฒด๋ฅผ ๋ ๋๋งํ ๋ ์ด ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ํ์ฑํํด์ผ ํฉ๋๋ค.
ํ์ฑํ๋ ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ์ ์ ฐ์ด๋๋ ๋ ๋๋ง ํธ์ถ์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ ์ ฐ์ด๋๋ฅผ ์ฐ๊ฒฐํ ๋, ๊ฐ ์ ฐ์ด๋์ ์ถ๋ ฅ์ ๋ค์ ์ ฐ์ด๋์ ์ ๋ ฅ์ ์ฐ๊ฒฐํฉ๋๋ค.
์ถ๋ ฅ๊ณผ ์ ๋ ฅ์ด ์ผ์นํ์ง ์์ผ๋ฉด ์ฐ๊ฒฐ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฝ์ต๋๋ค:
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glCreateProgram ํจ์๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ ์๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ๋ํ ID ์ฐธ์กฐ๋ฅผ ๋ฐํํฉ๋๋ค.
์ด์ ์ด์ ์ ์ปดํ์ผ๋ ์ ฐ์ด๋๋ฅผ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ์ฒจ๋ถํ ๋ค์ glLinkProgram์ผ๋ก ์ฐ๊ฒฐํด์ผ ํฉ๋๋ค:
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
์ฝ๋๋ ์๋ช ํฉ๋๋ค. ์ ฐ์ด๋๋ฅผ ํ๋ก๊ทธ๋จ์ ์ฒจ๋ถํ๊ณ glLinkProgram์ ํตํด ์ฐ๊ฒฐํฉ๋๋ค.
์ ฐ์ด๋ ์ปดํ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ฐ์ด๋ ํ๋ก๊ทธ๋จ ์ฐ๊ฒฐ์ ์คํจํ๋์ง ํ์ธํ๊ณ ํด๋น ๋ก๊ทธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง glGetShaderiv์ glGetShaderInfoLog ๋์ ๋ค์์ ์ฌ์ฉํฉ๋๋ค
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
if(!success) {
glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
...
}
๊ฒฐ๊ณผ๋ glUseProgram์ ํธ์ถํ์ฌ ์๋ก ์์ฑ๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ฌ์ฉํจ์ผ๋ก์จ ํ์ฑํํ ์ ์๋ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ๋๋ค:
glUseProgram(shaderProgram);
glUseProgram ์ดํ์ ๋ชจ๋ ์ ฐ์ด๋์ ๋ ๋๋ง ํธ์ถ์ ์ด์ ์ด ํ๋ก๊ทธ๋จ ๊ฐ์ฒด(๋ฐ๋ผ์ ์ ฐ์ด๋๋ค)๋ฅผ ์ฌ์ฉํ๊ฒ ๋ฉ๋๋ค.
์, ๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ ๊ฐ์ฒด์ ์ ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ ํ์๋ ๋ ์ด์ ํ์ํ์ง ์์ผ๋ฏ๋ก ์ ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ ๊ฒ์ ์์ง ๋ง์ธ์
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ์ ๋ ฅ ์ ์ ๋ฐ์ดํฐ๋ฅผ GPU์ ์ ์กํ๊ณ GPU๊ฐ ์ ์ ๋ฐ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋ ๋ด์์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋์ง ์ง์ํ์ต๋๋ค.
๊ฑฐ์ ๋ค ์์ง๋ง ์์ง ๋๋์ง ์์์ต๋๋ค.
OpenGL์ ์์ง ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํด์ํด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ ์ ฐ์ด๋์ ์์ฑ์ ์ด๋ป๊ฒ ์ฐ๊ฒฐํด์ผ ํ๋์ง ์์ง ๋ชปํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์น์ ํ๊ฒ OpenGL์๊ฒ ๊ทธ ๋ฐฉ๋ฒ์ ์๋ ค์ค ๊ฒ์ ๋๋ค.
'๐ธ OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Learn OpenGL] Hello Triangle - 4 (0) | 2023.11.18 |
|---|---|
| [Learn OpenGL] Hello Triangle - 3 (0) | 2023.11.17 |
| [Learn OpenGL] Hello Triangle - 1 (0) | 2023.11.16 |
| [Learn OpenGL] Creating a window(M1 Mac, Xcode) (0) | 2023.11.16 |
| [Learn OpenGL] OpenGL (0) | 2023.11.15 |