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

[Learn OpenGL] Shaders - 3

by HOENDEV 2023. 11. 18.

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