Vertex Buffer
Vertex Buffer๋ ๋ง ๊ทธ๋๋ก ๋ฒํผ์ด๋ค. ๊ทธ์ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ์ด๋ค.
๋ค๋ฅธ์ ์ด ์๋ค๋ฉด, GPU VRAM์ ์๋ค๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ๊ธฐ๋ณธ์ ์ธ ์ปจ์ ์ ๋ด๊ฐ ๊ทธ๋ฆฌ๊ณ ์ถ์ ๊ฒ์ ๋ฐ์ดํฐ๋ฅผ ์ ์(์๋ฅผ ๋ค์ด ์ผ๊ฐํ), ๊ทธ๋ฆฌ๊ณ GPU VRAM์ผ๋ก ๋ณด๋
๊ทธ๋ฆฌ๊ณ draw call์ ํจ ์ฌ๊ธฐ์ draw call์ GPU VRAM์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ผ๊ณ ํ๋ ๋ช ๋ น.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ GPUํํ ๊ฐ์ง๊ณ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํด์ํด์ผํ๋์ง ํ๋ฉด์ ์ด๋ค์์ผ๋ก ์ฌ๋ฆฌ๋์ง ์๋ ค์ค์ผ ํจ.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ด Shader์.
Shader๋ GPU์์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ ํ๋ฉด์ ํ์ํ๋.
unsigned int buffer;
glGenBuffers(1, &buffer); // ๋ฒํผ ์์ฑ
glBindBuffer(GL_ARRAY_BUFFER, buffer) // ๋ฒํผ ๋ฐ์ธ๋
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW); // ๋ฐ์ดํฐ ์ ๋ฌ
[...]
// In Loop
glDrawArrays(GL_TRIANGLES, 0, 3) // ๊ทธ๋ฆฌ๊ธฐ. ์์์ ๋ฐ์ธ๋ํ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฆฐ๋ค.
Vertex Attributes
Shader๊ฐ ๋ฒํผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ๋ฐ์ดํฐ์ ๋ ์ด์์์ ์์์ผ ํจ.
๋ฒํผ ๋ ์ด์์์ ๋ฌด์์ด ๋ฒํผ์ ํฌํจ๋์๋์ง๋ฅผ ์๋ฏธ.
Float๋ค์ด ๋ฌด์์ ์๋ฏธํ๋์ง ์ค๋ช position, texture coordinates, normals ๋ฑ
์ฆ ์ฐ๋ฆฌ๋ OpenGLํํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌด์์ด ์๋์ง ์ด๋ป๊ฒ ๋ ์ด์์ ๋์๋์ง ๋งํด์ค์ผ ํจ.
๊ทธ๋ ์ง ์์ผ๋ฉด ๊ทธ๋ฅ ๋ฐ์ดํธ ๋ฉ์ด๋ฆฌ์ผ ๋ฟ์.
๊ทธ๋ฆฌ๊ณ ์ด ์์ ์ vertex attibute pointer๊ฐ ํจ.
Shader์ชฝ์์๋ ์ ์ํ ๋ ์ด์์๊ณผ ๋ง์ถฐ์ผ ํจ.
glVertexAttribPointer(
0, // ์ธ๋ฑ์ค. Shader๋ attribute๋ฅผ index๋ฅผ ํตํด ์ฝ์. ์ด๋ค Attribute๋ฅผ ์๋ฏธํ๋์ง ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ํ๋.
3, // Vertex ์์ฑ๋น components๋ฅผ ๋ํ๋. 3์ฐจ์์ผ๋ก 3๊ฐ์ float์ ์ฌ์ฉํ๋ค๋ฉด, 3์ ๋๊ฒจ ์ค.
GL_FLOAT, // ๋ฐ์ดํฐ ํ์
GL_FALSE, // Normalize ์ฌ๋ถ
6 * sizeof(float), // ๊ฐ Vertex์ฌ์ด์ ๋ฐ์ดํธ๋ฅผ ๋ํ๋.
0 // ์์ฑ์ด ์๋ Offset
);
glEnableVertexAttribArray(0); // ํ์ฑํ ์์ผ์ค์ผ ํจ.
Shader
Shader๋ GPU์์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ์ด๋ค.
๋ค๋ฅธ ํ๋ก๊ทธ๋จ๋ค๊ณผ ๋๊ฐ์ด ์ปดํ์ผํ๊ณ , ๋งํนํ๊ณ ์คํํ๋ค. ๋ค๋ง GPU์์ ๋์๊ฐ๋ค.
์ GPU์์ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ์ด ํ์ํ ๊น?
GPU์๊ฒ ๋ฌด์์ ํ๋ผ๊ณ ๋ช ๋ นํ๊ณ ์ถ๊ธฐ ๋๋ฌธ, GPU๋ฅผ ์ ํ์ฉํ๊ณ ์ถ๊ธฐ ๋๋ฌธ
ํ๋ฉด์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ทธ๋ฆฌ๋ผ๊ณ ํ๊ณ ์ถ๊ธฐ ๋๋ฌธ
๋ง์ ์์ด๋๊ฐ ์์ง๋ง, ํฌ๊ฒ ๋ ๊ฐ์ง ํ์ ์ ์์ด๋์ ์ง์ค, ์ ์ผ ๋ง์ด ์
Vertex Shader, Fragment Shader
Vertex Shader
๊ฐ๊ฐ์ Vertex๋ง๋ค ํธ์ถ ๋จ. ์ผ๊ฐํ์ด๋ผ๋ฉด 3๋ฒ ํธ์ถ๋จ.
Vertex Shader์ ์ฃผ์ ๋ชฉํ๋ Vertex๊ฐ ํ๋ฉด ์ด๋์ ์์ด์ผํ๋์ง OpenGLํํ ๋งํด์ฃผ๋ ๊ฒ์.
#version 330 core // ๋ฒ์ ์ง์
layout(location = 0) in vec4 position; // ์์ฑ ์ธ๋ฑ์ค ์ง์
void main () {
gl_Position = position;
}
Fragment Shader
๊ฐ๊ฐ์ ๋ ์คํฐ๋ผ์ด์ฆ ๋์ด์ผํ๋ ํฝ์ ๋ง๋ค ํธ์ถ ๋จ.
์ฃผ์ ๋ชฉํ๋ ํฝ์ ์ด ์ด๋ค ์์์ด ๋์ด์ผํ๋์ง ์ ํ๋ ๊ฒ์.
#version 330 core
out vec4 color;
void main() {
color = vec4(1.0, 0.0, 0.0, 1.0);
}
Vertex Array
Vertex Array๋ ๋ค๋ฅธ ๊ทธ๋ํฝ์ค์๋ ์์. OpenGL์๋ง ์์.
glBindBuffer๋ก Vertex Buffer๋ฅผ ๋ฐ์ธ๋ ํ ํ glVertexAttribPointer๋ก ๋ ์ด์์๋ ํด์ฃผ์ด์ผ ํ๋๋ฐ,
Vertex Array๋ Vertex Buffer์ ๊ทธ์์ ๋ํ ์ฌ์, ๋ ์ด์์์ ๋ฐ์ธ๋ฉ ์์ผ์ค.
Vertex Array๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋
๊ธฐ์กด
Bind shader -> bind buffer -> set vertex layout -> bind index buffer -> issue draw
์ดํ
Bind shader -> bind vertex array -> bind index buffer -> issue draw
Texture
๋ฌด์ธ๊ฐ๋ฅผ ๋ ๋๋งํ ๋ ์ฌ์ฉํ ์ ์๋ ์ด๋ฏธ์ง.
CPU์ ์ด๋ฏธ์ง ๋ก๋ -> OpenGL์ฌ์ฉํด์ GPU์ Texture๋ก ์ ๋ก๋ -> Shader์์ Texture ์ฝ๊ธฐ -> ์์ ์ ํ๊ธฐ
glGenTextures(1, &m_RendererId);
glBindTexture(GL_TEXTURE_2D, m_RendererId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_LocalBuffer);
glBindTexture(GL_TEXTURE_2D, 0);
Blending
๋ธ๋ ๋ฉ์ ์ถ๋ ฅ ์์์ ํ๊ฒ ๋ฒํผ์ ์ด๋ฏธ ์๋ ์์๊ณผ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํฉ๋๋ค.
์ถ๋ ฅ ์์ -> Fragment Shader์์ ๋์ค๋ ์์
ํ๊ฒ ๋ฒํผ -> Fragment Shader๊ฐ ๊ทธ๋ฆด ๋ฒํผ
์ด๋ป๊ฒ ๋ธ๋ ๋ฉ ๋ ์ง ์ปจํธ๋กค ํ๋ ์ธ๊ฐ์ง ๋ฐฉ๋ฒ
- glEnable(GL_BLEND) - glDisable(GL_BLEND)
- glBlendFunc(src, dest)
src - src RGBA ์์๊ฐ ์ด๋ป๊ฒ ๊ณ์ฐ๋ ์ง (๊ธฐ๋ณธ์ GL_ONE = ๊ณฑํ๊ธฐ 1)
dest - dest RGBA ์์๊ฐ ์ด๋ป๊ฒ ๊ณ์ฐ๋ ์ง (๊ธฐ๋ณธ์ GL_ZERO = ๊ณฑํ๊ธฐ 0)
- glBlendEquation(mode)
mode - src์ dest๋ฅผ ์ด๋ป๊ฒ ํฉ์ฑํ ์ง ๊ธฐ๋ณธ์ add -> 1 + 0 = 1 -> src ์ฌ์ฉํ๋ค๋ ๋ป
'๐ธ OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Learn OpenGL] Textures - 1 (1) | 2023.11.20 |
|---|---|
| [Learn OpenGL] Shaders - 3 (0) | 2023.11.18 |
| [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 |