[์ปดํจํฐ ๊ทธ๋ํฝ์ค] OpenGL ์์ํด๋ณด์2 - ๊ทธ๋ํฝ์ค ํ์ดํ๋ผ์ธ1
๋ณธ ํฌ์คํ ์ ๋ชฉํ๋ 1ํธ์์ ๋ณด์ฌ์ฃผ์๋ ์ฐฝ์ ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๋๊ฒ์ด๋ค.
ํ์ง๋ง ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๊ธฐ ์ ์ ๋จผ์ ์์์ผํ ๊ฒ๋ค์ ์๊ฐํด๋ณด์.
OpenGL์ ๋์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํ๋ ค๊ณ ํ๋ค.
์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ ํ๊ฒ ๋๋ฉด ์ฝ๋์ ์ ์ฒด์ ์ธ ํ๋ฆ์ ์ ์ดํดํ ์ ์๊ฒ ๋๋ค.
์ผ๊ฐํ์ ๊ทธ๋ฆฐ๋ค๊ณ ๊ฐ์ ํด๋ณด์
์ฐ๋ฆฌ๋ ์ผ๊ฐํ์ ์ ๋ณด ๋ฐ์ดํฐ๋ค์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ์ํด์ ์ปดํจํฐ์๊ฒ ์๋ ค์ค์ผํ๋ค.
์ผ๋ จ์ ์ฒ๋ฆฌ๋ค์ ๊ฑฐ์ณ์ ์ปดํจํฐ๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค.
์ผ๋ จ์ ์ฒ๋ฆฌ๋ค์ ์ฌ๋ฌ๊ฐ์ง ํํ๋ฅผ ๊ฐ์ง ์ ์๋๋ฐ
GL์ ํ์ดํ๋ผ์ธ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋ค.
'ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋จ๊ณ์ ์ถ๋ ฅ์ด ๋ค์ ๋จ๊ณ์ ์ ๋ ฅ์ผ๋ก ์ด์ด์ง๋ ํํ๋ก ์ฐ๊ฒฐ๋ ๊ตฌ์กฐ'๋ฅผ ํ์ดํ๋ผ์ธ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
ํ์ดํ๋ผ์ธ ๊ตฌ์กฐ๋ ์ผ์ข ์ ๋ถ์ ์ฒด์ ์ด๋ค.
๊ทธ๋ํฝ ์ฒ๋ฆฌ ์์ ์ ๊ธฐ๋ฅ๋ณ๋ก ์ธ๋ถํํ์ฌ ์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ๋ฐฐ์นํ ๊ฒ์ด๋ค.
๊ธฐ๋ฅ๋ณ๋ก ์ธ๋ถํํ์ฌ ์์ฐจ์ ์ผ๋ก ๋ฐฐ์นํ๋ฉด ์ฌ๋ฌ ๋จ๊ณ๊ฐ ์๋ก ๋์์, ๋๋ ๋ณ๋ ฌ์ ์ผ๋ก ์ํ๋ ์ ์์ด ํจ์จ์ฑ์ด ๋์์ง๊ฒ ๋ง๋ค ์ ์๋ค.
OpenGL ํ์ดํ ๋ผ์ธ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฒํ ์ค ํจ์น, ๋ฒํ ์ค ์์ด๋, ํ ์ ๋ ์ด์ , ์ง์ค๋ฉํธ๋ฆฌ ์์ดํฐ, ๋์คํฐํ, ํ๋๊ทธ๋จผํธ ์์ด๋, ํ๋ ์ ๋ฒํผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ํ์๋ถ๋ถ๋ ์๊ณ ํ์๊ฐ ์๋๋ถ๋ถ๋ ์๋ค.
ํ์๋ถ๋ถ๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋ ํ๋์จ์ด์ ์ํด ๊ตฌํ๋๋ค.
๊ณ ์ ๋ ํ์ดํ๋ผ์ธ์ ์ฒ๋ฆฌ ์์๋ฅผ ๋ณ๊ฒฝํ ์๋ ์๊ณ ํ๋ก์ธ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ ์ผ์ ํ๋ค.
์๋๊ทธ๋ฆผ์ ๊ณ ์ ํจ์์ ๋ณ๊ฒฝํ ์ ์๋ ํ๋ก๊ทธ๋๋จธ๋ธํจ์๋ก ์ด๋ฃจ์ด์ง OpenGL ํ์ดํ๋ผ์ธ์ด๋ค.
์๋ตํ๊ฑฐ๋ ์ถ๊ฐํ ์ ์
์ผ๋ง์ ์ ๋ฉด์ ์์ Fixed Function Pipeline ์์๋๋ ์ง๋ฌธ์ ๋ฐ์๋๋ฐ ๊ทธ๊ฒ ๊ณ ์ ํจ์ ๋งํ๋๊ฑด์ง ๋ชจ๋ฅด๊ณ ์ด๋ฒ๋ฒ ๊ฑฐ๋ ธ๋ค.. ์์ด๋ก๋ ์์๋์..
1. ๋ฒํ ์ค ํจ์น(๋ฒํ ์ค ํ๋ง(์ ์ ํ๋ง)) & ๋ฒํ ์ค ์์ด๋
* ๋ฒํ ์ค ํจ์น
์๋์ ์ผ๋ก ๋ฒํ ์ค ์์ด๋์ ์ ๋ ฅ์ ์ ๊ณตํ๋ ์ผ์ ์ํํ๋ค.
์ ์ผํ ํ์ ์คํ ์ด์ง์ด๋ค.
์ ์ผ ์ฒซ๋ฒ์งธ ๋ฒํ ์ค ํจ์น(Vertex Fetch)๊ฐ ๋ฌด์์ด๋
Fetch๋ถํฐ ์์๋ณด์
https://www.computerhope.com/jargon/f/fetch.htm
์ด ์ฌ์ดํธ์ ๋ฐ๋ฅด๋ฉด Fetch(๊ฐ์ ธ์ค๊ธฐ)๋ ์ํํธ์จ์ด ํ๋ก๊ทธ๋จ, ์คํฌ๋ฆฝํธ ๋๋ ํ๋์จ์ด ์ฅ์น์ ์ํ ๋ฐ์ดํฐ ๊ฒ์์ด๋ผ๊ณ ํ๋ค. ๊ทธ๋ฌ๋ฉด ๋ฒํ ์ค ํจ์น๋ ๋ง๊ทธ๋๋ก ์ ์ ์ ๊ฐ์ ธ์จ๋ค๋ ๋ง์ด๋ค.
๋ฒํ ์ค ํจ์น/๋ฒํ ์ค ํจ์นญ/input assembler ๋ฑ๋ฑ ๋ถ๋ฅด๋ ๋ช ์นญ์ด ์กฐ๊ธ์ฉ ๋ค๋ฅด๋๋ฐ ์ ์ ์ ์ ๋ ฅํด์ฃผ๋ ๊ฒ์ด๋ผ ๋ณด๋ฉด ๋๋ค.
* ๋ฒํ ์ค ์์ด๋
๊ฐ์ ธ์จ ํ์๋ ๋๋ฒ์งธ ๋ฒํ ์ค ์์ด๋(Vertex Shader) ๊ณผ์ ์ด๋ค.
๋ฒํ ์ค ์์ด๋๋
https://ko.wikipedia.org/wiki/%EB%B2%84%ED%85%8D%EC%8A%A4_%EC%85%B0%EC%9D%B4%EB%8D%94
์ฌ๊ธฐ์ ๋์์๋ฏ์ด ๋ฌผ์ฒด์ ์ ์ ์ ๋ณด์ ์ํ์ ์ธ ์ฐ์ฐ์ ํจ์ผ๋ก์จ ๋ฌผ์ฒด์ ํน๋ณํ ํจ๊ณผ๋ฅผ ์ฃผ๋๋ฐ ์ฐ์ธ๋ค๊ณ ํ๋ค.
์ ์ ์ ๋ณด๋ ์์น ์ขํ, ์์, ํ ์ค์ฒ, ์กฐ๋ช ์ ๋ณด ๋ฑ ๋ค์ํ๊ฒ ๋ค์ด์ฌ ์ ์๋ค.
ํ์ง๋ง ๊ธฐ์กด์ ์ ์ ์ ์ง์ฐ๊ฑฐ๋ ์๋ก์ด ์ ์ ์ ์ถ๊ฐํ๋ ๋ฑ์ ์์ ์ ๋ถ๊ฐ๋ฅํ๋ค.
์ด ๋ง์ด ๋ฌด์จ๋ง์ด๋๋ฉด,
๋ง์ฝ ์ ์ ์ด X0,X1,X2์ ์์น ์ขํ๋ก์จ ์ด์๊ฐ์ด ๋ค์ด์๋ค๋ฉด ์์ด๋ ์ฝ๋๋ฅผ ์ด์ฉํด์ ์๋ก์ด X4 ์ขํ๋ฅผ ์ถ๊ฐํ๋ค๋์ง ํน์ ๋ค์ด์จ X0,X1,X2์ ์๋ณธ ์ขํ๋ฅผ ๋ฐ๊พผ๋ค๋์ง์ ์์ ์ ์๋๋ค๋ ๊ฒ์ด๋ค.
๐ ํ์ง๋ง ์ ์ํด์ผํ ์ ์ด ์๋ณธ์ ๋ฐ๊พธ์ง ๋ชปํ๋ ๊ฒ์ด์ง ๊ฐ๊ณตํด์ ์ธ์๋ ์๋ค! ๐
์์ ๊ฐ์ด V(1,0,0)์ ๋ํด์ฃผ๋ฉด ์ผ๊ฐํ์ ๋ง์น x์ถ์ผ๋ก 1์ฉ ์ฎ๊ธด๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
์์๋ฅผ ๋ ๊ฒ ๋ฟ์ด์ง ๋ค๋ฅธ ๋ค์ํ ์์ ์ด ๊ฐ๋ฅํ๋ค. ์์ ๊ทธ๋ฆผ๋ค์ ์ธ์คํด์ฑ์ ์ฌ์ฉํ ๋ ์ด๋ป๊ฒ ์ธ ์ ์๋์ง ๋ค์ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
๋ง์ฝ 3์ฐจ์ ๋ฌผ์ฒด๋ฅผ ํ๋ฉด์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์ ์ํ๋ค๋ฉด,
์ด ๊ณผ์ ์์ 3์ฐจ์ ์ขํ๋ค์ 2์ฐจ์ ์ขํ๋ก ๋ณ๊ฒฝํ๋ ์ฐ์ฐ์ด ์ผ์ด๋๋ค.
3์ฐจ์ ๊ณต๊ฐ์์์ ๋ฌผ์ฒด๋ค์ ๋ชจ๋ x,y,z ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค. ํ์ง๋ง ํ์ค์์ ์ฐ๋ฆฌ๋ ๋ชจ๋ํฐ์ ๊ฐ์ ํ๋ฉด ๋์คํ๋ ์ด๋ฅผ ํตํด 3์ฐจ์ ์ขํ๋ฅผ ๋ณผ๊ฒ๋๋ค. ์ดํด๊ฐ ์ด๋ ต๋ค๋ฉด ์นด๋ฉ๋ผ๋ฅผ ์๊ฐํด๋ณด์.
์ฌ์ง์ ์ฐ๋ ๋์์ ํ์ค ๊ณต๊ฐ์ธ 3์ฐจ์ ๊ณต๊ฐ์ ์๊ณ ์ฐ๋ฆฌ๋ 2์ฐจ์ ํ๋ฉด์ธ ์ฌ์ง ์์ ํผ์ฌ์ฒด๋ฅผ ๋ด๊ฒ ๋๋ค.
๋ฐ๋ผ์ 3์ฐจ์ ์ขํ๋ฅผ 2์ฐจ์ ์ขํ๋ก ๋ณ๊ฒฝ์ ํ์ฌ์ ์ ์ ์ ์์น๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
2. ํ ์ ๋ ์ด์
OpenGL์์ ํ ์ ๋ ์ด์ ๊ณผ์ ์ ๊ณ ์ ํจ์์ด๋ฉฐ
์ผ์ ํ ํํ์ ๋ํ๋ค๋ก ํ๋ฉด์ ๋นํ ์์ด ์ฑ์ฐ๋ ๊ฒ์ ๋งํ๋ค.
ํด๋ฆฌ๊ณค ์์ ํด๋ฆฌ๊ณค์ผ๋ก ์ฑ์ฐ๋ ๊ฒ์ธ๋ฐ ์ค์ ๊ฐ์ ํฅ์์ํค๊ธฐ ์ํด ํ๋ ์์ ์ด๋ค.
ํ์ง๋ง ํด๋ฆฌ๊ณค์ ์ซ์๋ฅผ ๋์ด๋ ๊ฒ์ ์ฑ๋ฅ์ ์ ํ๋ฅผ ์ด๋ํ ์ ์์ผ๋ ์ ์ํ์ฌ์ผ ํ๋ค.
๋ค์์ ํ ์ ๋ ์ด์ ๊ณผ์ ์ด๋ค.
์ค์ฌ์ ํ ์ ๋ ์ด์ ๋จ๊ณ๋ก๋ง ๋งํ๋ ๊ทธ๋ํฝํ์ดํ๋ผ์ธ ์ค๋ช ๋ ๋ง์๋ฐ ์ ํํ๊ฒ๋ 3๋จ๊ณ๋ก ์ด๋ฃจ์ด์ ธ์๋ค.
์๋ง ๋ง์ด ์ฐ์ง ์์์ ๊ทธ๋ฐ๊ฒ ์๋๊น ์ถ์๋ฐ ํ ์ ๋ ์ด์ ์ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ํ ํ๋ฉด์ ์ผ๊ฐํ์ผ๋ก ๊ฝ์ฑ์ฐ๋ ๋ฐฉ์์ด๋ค.
์ด๋ฅผ ์ด์ฉํด์ ํ๋ ๊ฒ์ ๋์ด๋ ๊ผญ์ง์ ์ ๋๋ฎ์ด๋ฅผ ์ด์ฉํ์ฌ ํ๋ฉด์ ์ธํ๋ถํํ๊ฒ๋ ๋ง๋ค ์ ์๋ค.
ํ์ง๋ง ์ด๋ ๊ฒ ๋ณํ์ ํ๋ฉด ๋น์ฐํ ๊ผญ์ง์ ์ ๊ฐฏ์๊ฐ ๋์ด๋๋ค. ๋ฐ๋ผ์ ์ฒ๋ฆฌํด์ผํ ์๋ ๋ง๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋ฒํ๋งตํ์ด๋ ๋ ธ๋ง๋งตํ ๋ฑ๋ฑ ๋์์์ ํ๋ ๋งตํ๋ค์ ๋ง์ด ํ๊ณ 2010๋ ๋๊น์ง ๋ง์ด ์ฌ์ฉํ์ง ์์๋ค๊ณ ํ๋ค. ์์ ์ ๋นํด์ ํ์ฌ๋ ์ปดํจํฐ์ ์ฌ์๋ค์ด ๋ง์ด ์ข์์ก๊ธฐ ๋๋ฌธ์ ์ต๊ทผ์๋ ์ฌ์ฉํ ๊ฒ์๋ค๋ ๊ฝค ์๋ค.
* ํ ์ ๋ ์ด์ ์ปจํธ๋กค ์์ด๋
ํ ์ ๋ ์ด์ ์ธ ๊ฐ์ง ๋จ๊ณ ์ค ์ฒซ ๋ฒ์งธ ๋จ๊ณ์ด๋ค.
์ด ์์ด๋๋ ๋ฒํ ์ค ์์ด๋๋ก๋ถํฐ ์ ๋ ฅ์ ๋ฐ์ ์ฃผ๋ก ๋ ๊ฐ์ง ์ผ์ ์ํํ๋ค.
* ํ ์ ๋ ์ด์ ์์ง์ ๋ณด๋ผ ํ ์ ๋ ์ด์ ์ ๋ ๋ฒจ์ ๊ฒฐ์
* ์ํ๋ ๋ค์์ ์คํ๋๋ ํ ์ ๋ ์ด์ ์ด๋ฒจ๋ฅ์์ด์ ์์ด๋์ ๋ณด๋ผ ๋ฐ์ดํฐ๋ฅผ ์์ฑ
* ํ ์ ๋ ์ด์ ๊ณ ์ ํจ์
ํจ์น๋ก ํํ๋๋ ๊ณ ์ฐจ ์ํผ์ค๋ฅผ ์ , ์ , ์ผ๊ฐํ๊ณผ ๊ฐ์ ์์ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ก ๋ถํ ํ๋ ์ญํ ์ ์ํํ๋ค.
ํ ์ ๋ ์ด์ ์ด๋ฒจ๋ฅ์์ด์ ์์ด๋์ ํธ์ถ์ ์ฌ์ฉ๋ ์ธ์๋ฅผ ์์ฑํ๋ ์ญํ ์ ์ํํ๋ค.
https://ogldev.org/www/tutorial30/tutorial30.html
Primitive Generator๋ผ๊ณ ๋ ๋ถ๋ฅด๋ ๊ฒ ๊ฐ๋ค. ์์ ๋งํฌ์์ ๋ณด๋ฉด ์ฌ๋ฌ๊ฐ์ง ์ค์ ๋ค์ ํตํด์
glDrawElements(GL_PATCHES, m_Entries[i].NumIndices, GL_UNSIGNED_INT, 0);
์ด ๋ถ๋ถ์์ GL_PATCHES ์ด ๋ถ๋ถ์ ํ ์ ๋ ์ด์ ๊ด๋ จ ๋ ๋ฒจ ๋ฐ ๋ฐ์ดํฐ๋ค์ ์์ฑํด์ ๋ฃ์ด์ฃผ๋ ํ์์ด๋ค.
์ด ํ๋ฆฌ๋ฏธํฐ๋ธ ๋ถ๋ถ์๋ ์ค์ ์ ํด์ฃผ์ง ์์๋ GL_POINTS, GL_LINES, GL_LINE_STRIP ๋ฑ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋ง๋ค์ด์ ธ์๋ ์ต์ ์ด ์๋ค. ์ด ๋ถ๋ถ์ ๋์ค์ ์ผ๊ฐํ์ ๊ทธ๋ฆด ๋ ๋ค์ ์์๋ณด๋๋ก ํ์.
* ํ ์ ๋ ์ด์ ์ด๋ฒจ๋ฅ์์ด์ ์์ด๋
ํ ์ ๋ ์ดํฐ์ ์ํด ์์ฑ๋ ๊ฐ ๋ฒํ ์ค์ ๋ํด ํ ๋ฒ์ฉ ํธ์ถ์ ์ํ๋๋ค.
๋ ์ด์์ ์ง์์ด๋ก ํ ์ ๋ ์ด์ ๋ชจ๋๋ฅผ ์ค์ ํ๋ค.
--------------------------------------------------------------------------------------------------------------------------------------------