๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ˜ธ OpenGL

OpenGL ์šฉ์–ด ์ •๋ฆฌ

by HOENDEV 2023. 11. 19.

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