OpenGL์ ๋ด์ฅ๋ ํ๋ ฌ์ด๋ ๋ฒกํฐ ์ง์์ด ์๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๊ฐ ์ง์ ์ํ์ ํด๋์ค์ ํจ์๋ฅผ ์ ์ํด์ผ ํ๋ค. ๋คํํ๋, ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง OpenGL์ ๋ง๊ฒ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ํนํ๋ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ GLM์ด ์๋ค.
โ GLM
GLM์ OpenGL Mathematics์ ์ฝ์๋ก ํค๋ํ์ผ๋ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ์ด๋ ๋งํน๊ณผ ์ปดํ์ผ์ด ํ์ ์์ด ์ ์ ํ ํค๋ํ์ผ๋ง ํฌํจํ๋ฉด ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ค์ด๋ก๋ : https://glm.g-truc.net/0.9.9/index.html
* 0.9.9 ๋ฒ์ ๋ถํฐ๋ ๊ธฐ๋ณธ ํ๋ ฌ์ด ๋จ์ ํ๋ ฌ์ด ์๋ 0์ผ๋ก ์ด๊ธฐํ๋ ํ๋ ฌ์ด๋ค. ๋ฐ๋ผ์ glm::mat4 mat = glm::mat4(1.0f)์ ๊ฐ์ด ํ๋ ฌ์ ์ด๊ธฐํํด์ผ ํ๋ค.
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
์ฐ๋ฆฌ๊ฐ ํ์๋กํ๋ GLM์ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ์ ์ ํค๋ํ์ผ์์ ์ฐพ์ ์ ์๋ค.
โ ํํ ์ด๋
// vec4 ํ์
'vec' ์ ์ธ
glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);
// 4x4 ๋จ์ ํ๋ ฌ 'mat4' ์ ์ธ
glm::mat4 trans = glm::mat4(1.0f);
// ๋ณํ ํ๋ ฌ ์์ฑ ๋ฐ ๋ณํ ๋ฒกํฐ ์ง์
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));
// ๋ณํ ํ๋ ฌ์ ๊ณฑํด ๋ฒกํฐ๋ฅผ ๋ณํ
vec = trans * vec;
(1, 0, 0) ๋ฒกํฐ์ (1, 1, 0) ๋งํผ ํํ์ด๋์ ํ์ฌ (2, 1, 0) ๋ฒกํฐ๊ฐ ๋์๋ค.
โ ํ์
glm::mat4 trans = glm::mat4(1.0f);
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
z์ถ์ ์ค์ฌ์ผ๋ก 90๋ ํ์ ์ํค๋ ๋ณํ ํ๋ ฌ
โ ์ค์ผ์ผ๋ง
glm::mat4 trans = glm::mat4(1.0f);
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));
๊ฐ ์ถ์ ๋ํด 0.5๋ฐฐ๋ก ์ค์ผ์ผ๋ง ํ๋ ๋ณํ ํ๋ ฌ
โ ๋ณํํ๊ธฐ
unsigned int transformLocation = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLocation, 1, GL_FALSE, glm::value_ptr(trans));
glUniformMatrix4fv์ ๋งค๊ฐ๋ณ์
1. uniform์ location (glGetUniformLocation ํจ์ ์ฌ์ฉ)
2. ๋ฃ์ ํ๋ ฌ์ ๊ฐ์
3. ํ๊ณผ ์ด์ ๋ฐ๊ฟ์ง ์ฌ๋ถ
4. value_ptr์ ์ด์ฉํด ๋ณํ๋ ์ค์ ํ๋ ฌ ๋ฐ์ดํฐ (๋๋ &trans[0][0] ์ ํ์์ผ๋ก๋ ํ๋ ฌ ๋ฐ์ดํฐ์ ๋ฐฐ์ด ํฌ์ธํฐ ํํ๋ก ์ ๊ทผ๊ฐ๋ฅ)
- Vertex Shader
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos, 1.0f);
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
์ดํ Vertex Shader์์ uniform mat4 ๋ณ์ 'transform'์ ์ ์ธํ์ฌ ๋ฐ์์ค๊ณ , ์์น๋ฒกํฐ์ ์ด ํ๋ ฌ uniform์ ๊ณฑํ์ฌ ๋ณํ๋ ๊ฐ์ ์ป๋๋ค.
์ด์ฒ๋ผ vertex shader์์ ๋ณํ์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ๋ค์ ์ ๋ฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ vertex ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์ํ๋ ์๊ณ ๋ฅผ ๋์ด์ฃผ๊ณ ์ผ๋ถ ์์
์์ ์๊ฐ์ ์๋ ์ ์๋ค.
* ํ๋ ์๋ง๋ค ๋ณํ์ ์
๋ฐ์ดํธํ๋ ค๋ฉด ๋ ๋ ๋ฃจํ๊ฐ ๋๋๋ง๋ค ์ ์ธํด์ผ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ๋ฉด ๋ ๋๋ง ๋ฃจํ๊ฐ ๋๋๋ง๋ค ์๋ก์ด ๊ฐ์ผ๋ก ์ฌ์์ฑ๋ ์ฌ๋ฌ ๋ณํ ํ๋ ฌ๋ค์ ์ฌ์ฉํ๋ค.
โ ํ๋ ฌ ์กฐํฉ
๋ณํ ํ๋ ฌ ์กฐํฉ ์ ์์๋ฅผ ์ ์ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด ํํ์ด๋๊ณผ ํ์ ์ ์กฐํฉํ์ฌ ๋ณํ ํ๋ ฌ์ ๊ตฌ์ฑํ ๋,
1. ํํ์ด๋ ํ ํ์ : ๊ฐ์ฒด๋ ํํ์ด๋๋ ์์น์์ ์์ ์ ๊ธฐ์ค์ผ๋ก ํ์ ํ๋ค. ๋ฐ๋ผ์ ํ์ ์ด ์ ์ฉ๋ ํ์ ๊ถค์ ์ ์์ ์ ์ค์ฌ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค.
2. ํ์ ํ ํํ์ด๋ : ๊ฐ์ฒด๋ ์์ ์์ ํ์ ํ ํ, ํ์ ๋ ์ํ์์ ํํ์ด๋๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ฒด๋ ํ์ ๋ ์ํ์์ ํํ์ด๋๋ ๊ฒฐ๊ณผ๋ก, ์๊ธฐ ์์ ์ ์ค์ฌ์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ํ๋ค.
* ์ฝ๋ ์์ฑ ์์๋ ์์๋ฅผ ๋ฐ๋๋ก ์์ฑํด์ผ ํ๋ค (ํ๋ ฌ ์ฐ์ฐ์ ํน์ฑ์, ํ๋ ฌ์ด ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ณฑํด์ง๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ ์ฉ๋๋ ๋ณํ ์์๋ ์์ฑ๋ ์์์ ๋ฐ๋๊ฐ ๋๋ค)
โ ์์ค ์ฝ๋
'๐จ Graphics > ๐ต OpenGL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [OpenGL] 3์ฐจ์ ๊ฐ์ฒด ๋ ๋ 1 (0) | 2024.08.02 |
|---|---|
| [OpenGL] ์ขํ๊ณ (Coordinate System) (0) | 2024.08.02 |
| [OpenGL] ํ๋ ฌ (Matrix) (0) | 2024.07.30 |
| [OpenGL] ๋ฒกํฐ (Vector) (0) | 2024.07.30 |
| [OpenGL] Texture ์ ๋ (0) | 2024.07.28 |