More Attributes!
์ด์ ์ฅ์์ VBO๋ฅผ ์ฑ์ฐ๊ณ , ์ ์ ์์ฑ ํฌ์ธํฐ๋ฅผ ๊ตฌ์ฑํ๊ณ , ์ด ๋ชจ๋ ๊ฒ์ VAO์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ณด์์ต๋๋ค.
์ด๋ฒ์๋ ์ ์ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
๊ฐ ์ ์ ๋ฐฐ์ด์ 3๊ฐ์ float์ผ๋ก ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๊ฒ์
๋๋ค. ๊ฐ๊ฐ์ ์ผ๊ฐํ ๋ชจ์๋ฆฌ์ ๋นจ๊ฐ์, ๋
น์, ํ๋์์ ํ ๋นํฉ๋๋ค
float vertices[] = {
// ์์น // ์์
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // ์ค๋ฅธ์ชฝ ์๋
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // ์ผ์ชฝ ์๋
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // ์
};
์ด์ ์ ์ ์์ด๋๋ก ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ผ ํ๊ธฐ ๋๋ฌธ์, ์ ์ ์์ฑ ์
๋ ฅ์ผ๋ก ์์ ๊ฐ์ ๋ฐ๊ธฐ ์ํด ์ ์ ์์ด๋๋ฅผ ์กฐ์ ํ ํ์๊ฐ ์์ต๋๋ค.
layout ์ง์ ์๋ฅผ ์ฌ์ฉํ์ฌ aColor ์์ฑ์ ์์น๋ฅผ 1๋ก ์ค์ ํ๋ ๊ฒ์ ์ ์ํ์ญ์์ค.
#version 330 core
layout (location = 0) in vec3 aPos; // ์์น ๋ณ์๋ ์์ฑ ์์น 0์ ๊ฐ์ง
layout (location = 1) in vec3 aColor; // ์์ ๋ณ์๋ ์์ฑ ์์น 1์ ๊ฐ์ง
out vec3 ourColor; // ์กฐ๊ฐ ์์ด๋๋ก ์์์ ์ถ๋ ฅ
void main()
{
gl_Position = vec4(aPos, 1.0);
ourColor = aColor; // ์ ์ ๋ฐ์ดํฐ์์ ๋ฐ์ ์
๋ ฅ ์์์ผ๋ก ourColor๋ฅผ ์ค์
}
์ด์ Fragment์ ์์์ ๋ํด ์ ๋ํผ์ ์ฌ์ฉํ์ง ์๊ณ ourColor ์ถ๋ ฅ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์กฐ๊ฐ ์์ด๋๋ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
#version 330 core
out vec4 FragColor;
in vec3 ourColor;
void main()
{
FragColor = vec4(ourColor, 1.0);
}
VBO์ ๋ฉ๋ชจ๋ฆฌ์ ๋ ๋ค๋ฅธ ์ ์ ์์ฑ์ ์ถ๊ฐํ๊ณ ์
๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ ์ ์ ์์ฑ ํฌ์ธํฐ๋ฅผ ๋ค์ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค.
VBO์ ๋ฉ๋ชจ๋ฆฌ์์ ์
๋ฐ์ดํธ๋ ๋ฐ์ดํฐ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์
๋๋ค.

์์น์ ์์ ๋ฐ์ดํฐ๊ฐ VBO ๋ด๋ถ์์ ๊ต์ฐจ๋์ด ์์ด glVertexAttribPointer๋ก ๊ตฌ์ฑ๋จ
ํ์ฌ ๋ ์ด์์์ ์๊ณ ์์ผ๋ฏ๋ก glVertexAttribPointer๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ์์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค.
// ์์น ์์ฑ
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// ์์ ์์ฑ
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3* sizeof(float)));
glEnableVertexAttribArray(1);
glVertexAttribPointer์ ์ฒ์ ๋ช ๊ฐ์ ์ธ์๋ ๋น๊ต์ ๋ช ํํฉ๋๋ค.
์ด๋ฒ์๋ ์์ฑ ์์น 1์์ ์ ์ ์์ฑ์ ๊ตฌ์ฑํฉ๋๋ค. ์์ ๊ฐ์ 3๊ฐ์ float ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ฉฐ ๊ฐ์ ์ ๊ทํํ์ง ์์ต๋๋ค.
์ด์ ๋ ๊ฐ์ ์ ์ ์์ฑ์ด ์์ผ๋ฏ๋ก ์คํธ๋ผ์ด๋ ๊ฐ์ ๋ค์ ๊ณ์ฐํด์ผ ํฉ๋๋ค.
๋ฐ์ดํฐ ๋ฐฐ์ด์์ ๋ค์ ์์ฑ ๊ฐ(์: ์์น ๋ฒกํฐ์ ๋ค์ x ๊ตฌ์ฑ ์์)์ ์ป์ผ๋ ค๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก 6๊ฐ์ float๋งํผ ์ด๋ํด์ผ ํฉ๋๋ค.
์ธ ๊ฐ๋ ์์น ๊ฐ์ด๊ณ ์ธ ๊ฐ๋ ์์ ๊ฐ์ ๋๋ค. ์ด๋ก ์ธํด ์คํธ๋ผ์ด๋ ๊ฐ์ float์ ํฌ๊ธฐ์ธ 6๋ฐฐ์ธ ๋ฐ์ดํธ(= 24 ๋ฐ์ดํธ)๊ฐ ๋ฉ๋๋ค.
๋ํ ์ด๋ฒ์๋ ์คํ์ ์ ์ง์ ํด์ผ ํฉ๋๋ค. ๊ฐ ์ ์ ์ ๋ํด ์์น ์ ์ ์์ฑ์ด ๋จผ์ ์ค๋ฏ๋ก 0์ ์คํ์ ์ ์ ์ธํฉ๋๋ค.
์์ ์์ฑ์ ์์น ๋ฐ์ดํฐ ๋ค์ ์์ํ๋ฏ๋ก ์คํ์ ์ 3 * sizeof(float)์ ๋ฐ์ดํธ(= 12 ๋ฐ์ดํธ)์ ๋๋ค.

์ด๋ฏธ์ง๊ฐ ์ฌ๋ฌ๋ถ์ด ์์ํ๋ ๊ฒ๊ณผ ์ ํํ ์ผ์นํ์ง ์์ ์ ์์ต๋๋ค.
์๋ํ๋ฉด ์ฐ๋ฆฌ๋ ๋จ์ง 3๊ฐ์ง ์์๋ง ์ ๊ณตํ์ง๋ง, ์ง๊ธ ๋ณด์ด๋ ๊ฒ์ ๋ฐฉ๋ํ ์์ ํ๋ ํธ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด ๋ชจ๋ ๊ฒ์ ์กฐ๊ฐ ์์ด๋์์ ๋ฐ์ํ๋ '(fragment interpolation)'์ด๋ผ๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ๋๋ค.
์ผ๊ฐํ์ ๋ ๋๋งํ ๋ ๋์คํฐํ ๋จ๊ณ๋ ์๋ ์ง์ ๋ ์ ์ ๋ณด๋ค ํจ์ฌ ๋ ๋ง์ ์กฐ๊ฐ๋ค์ ์์ฑํฉ๋๋ค. ๋์คํฐ๋ผ์ด์ ๋ ์ผ๊ฐํ ๋ชจ์ ์์ ์์นํ ๊ฐ ์กฐ๊ฐ์ ์์น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
์ด ์์น์ ๊ธฐ๋ฐํ์ฌ, ์กฐ๊ฐ ์์ด๋์ ๋ชจ๋ ์ ๋ ฅ ๋ณ์๋ค์ด ๋ณด๊ฐ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์์ชฝ ์ ์ด ๋ น์์ด๊ณ ์๋์ชฝ ์ ์ด ํ๋์์ธ ์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ์กฐ๊ฐ ์์ด๋๊ฐ ์ ์ 70% ์์น์ ์๋ ์กฐ๊ฐ์์ ์คํ๋๋ฉด, ๊ทธ ๊ฒฐ๊ณผ ์์ ์ ๋ ฅ ์์ฑ์ ๋ น์๊ณผ ํ๋์์ ์ ํ ์กฐํฉ์ด ๋ ๊ฒ์ ๋๋ค.
๋ ์ ํํ๊ฒ ๋งํ์๋ฉด 30% ํ๋์๊ณผ 70% ๋ น์์ด ๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ์ผ๊ฐํ์์ ๋ฐ์ํ ์ผ์ ๋๋ค. ์ฐ๋ฆฌ๋ 3๊ฐ์ ์ ์ ๊ณผ ๋ฐ๋ผ์ 3๊ฐ์ง ์์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์ผ๊ฐํ์ ํฝ์ ์ ๋ณด๋ฉด ์๋ง๋ ์ฝ 50000๊ฐ์ ์กฐ๊ฐ๋ค์ด ์์ ๊ฒ์ด๋ฉฐ,
์ฌ๊ธฐ์ ์กฐ๊ฐ ์์ด๋๋ ์ด ํฝ์ ๋ค ์ฌ์ด์์ ์์์ ๋ณด๊ฐํ์ต๋๋ค.
์์์ ์์ธํ ์ดํด๋ณด๋ฉด ๋ชจ๋ ๊ฒ์ด ๋ง์ด ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค: ๋นจ๊ฐ์์์ ํ๋์์ผ๋ก ๊ฐ๋ฉด์ ๋จผ์ ๋ณด๋ผ์์ด ๋๊ณ ๊ทธ ๋ค์์ ํ๋์์ด ๋ฉ๋๋ค. ์กฐ๊ฐ ๋ณด๊ฐ์ ์กฐ๊ฐ ์์ด๋์ ๋ชจ๋ ์ ๋ ฅ ์์ฑ์ ์ ์ฉ๋ฉ๋๋ค.
'๐ธ OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Learn OpenGL] Textures - 1 (1) | 2023.11.20 |
|---|---|
| OpenGL ์ฉ์ด ์ ๋ฆฌ (0) | 2023.11.19 |
| [Learn OpenGL] Shaders - 2 (0) | 2023.11.18 |
| [Learn OpenGL] Shaders - 1 (1) | 2023.11.18 |
| [Learn OpenGL] Hello Triangle - 4 (0) | 2023.11.18 |