분류 전체보기 115

[OpenGL] Normal Transformation (Normal Matrix)

학교 컴퓨터 그래픽스 수업에서는 적당히 언급만 하고 넘어갔던 부분이라서, 개인적으로 공부해보았다.  Phong Reflection Model을 통한 쉐이딩을 위해서는 물체의 표면의 normal을 구해야 한다.이 때의 normal은 World Space(월드 좌표계) 기준이어야 한다. 쉐이딩은 World Space에서 처리할 것이기 때문. 위치나 벡터를 Object Space에서 World Space로 변환하는 방법은 Model Matrix를 곱하는 것이고, normal 역시 uniform scaling(x, y, z 축으로 같은 비율로 scaling)일 경우에는 그냥 Model Matrix를 곱하면 된다.   다만, non-uniform scaling을 수행하는 Model Matrix의 경우 그냥 곱하면..

OpenGL/공부 2024.06.15

[OpenGL] Phong Reflection Model - 개요

Phong Reflection Model은 워낙 유명하고 관련 문서도 많으니, 간단하게 개요만 적으려 한다. 원래 3D 공간 상에서 빛과 쉐이딩을 표현하려면, 빛이 사물에 부딪혀 반사되는 것을 모두 시뮬레이션해야한다.반사는 매우 많이 일어날 것이기 때문에, 리얼타임으로는 이러한 시뮬레이션이 힘들다. Phong Reflection Model은 빛의 표현을 간단하게 근사하는 모델이다.  3가지 파트로 이루어진다.Ambient Lighting : 주변광을 의미한다. 빛이 외부로부터 들어올 때, 예를 들면 바깥에서 자연광이 창문 등으로 들어온다고 했을 때, 빛이 직접적으로 닿지 않는 곳도 어느정도 밝게 보인다.일부 구역은 빛이 직접적으로 때리지 않더라도 환경과의 복잡한 난반사로 인해 어느정도의 밝기를 가지게 되..

OpenGL/공부 2024.06.15

[OpenGL] Textures (5) - 적용 (VAO 수정)

텍스쳐를 입히기 전 먼저 도형들에 텍스쳐 좌표를 넣어줄 것이다. 현재 만들어둔 도형은 삼각형으로만 이루어진 피라미드 모양이므로, 각 면에 다음과 같은 모양으로 텍스쳐를 입힐 것이다. 이 점을 감안하면서 각 버텍스마다 텍스쳐 좌표를 지정해주었다.GLfloat vertices[] = { //x y z u v -1.0f, -1.0f, 0.0f, 0.f, 0.f, 0.0f, 1.0f, 0.0f, 0.5f, 1.f, 0.0f, -1.0f, 1.0f, 1.f, 0.f, 0.0f, -1.0f, 1.0f, 0.f, 0.f, 0.0f, 1.0f..

OpenGL/공부 2024.06.13

[OpenGL] Textures (4) - 로드(stb_image), 생성, 바인딩(Texture Unit)

이번엔 코딩을 통해 실제로 텍스쳐를 입혀볼 것이다. 먼저 디스크에 저장된 이미지 파일을 메인 메모리에 로드해야하는데, 처음이면서도 가장 어려운 부분이다.다행히도 이걸 손쉽게 할 수 있게 해주는 라이브러리가 있다. stb라는 라이브러리로, 헤더 파일 하나로만 이루어진 매우 가벼운 라이브러리이다.https://github.com/nothings/stb/blob/master/stb_image.h stb/stb_image.h at master · nothings/stbstb single-file public domain libraries for C/C++. Contribute to nothings/stb development by creating an account on GitHub.github.com stb_..

OpenGL/공부 2024.06.13

[OpenGL] Textures (3) - Wrapping

텍스쳐의 좌표는 앞선 포스팅에서 설명한 바와 같이 (0, 0) ~ (1, 1) 사이의 값을 가진다. 그런데 프로그래머가 고의로든, 실수로든 0 미만 / 1 초과의 좌표값을 할당했다면, 그 부분은 어떻게 처리해줘야 할까? 이때의 처리 방식을 정해주는 것이 Texture Wrapping이다.  OpenGL이 제공해주는 옵션들은 다음과 같다.  GL_REPEAT텍스쳐를 여러개 이어붙인 것처럼 처리한다.좌표로 (1.5, 1.5)를 주었다면, 3x3 이미지 중 우측 상단의 이미지의 가운데의 텍셀을 떼올 것이다.횡스크롤 게임의 배경 등에 사용되는 방식이다. 처음과 끝을 자연스럽게 이어지도록 해서 반복시키면 가로로 긴 맵이어도 배경 리소스가 많이 필요하지 않기 때문.GL_MIRRORED_REPEATGL_REPEAT랑..

OpenGL/공부 2024.06.12

[OpenGL] Textures (2) - Mipmap

이전 포스팅에서 Nearest Filtering, Linear Filtering을 다뤘었다. Linear Filtering의 경우 Nearest Filtering보다 더 깨끗한 화면을 제공해주기는 하지만, 그래도 Minification 발생시 지저분해보이는 것은 여전하다. 원래 aliasing(왜곡)은 Minification에서 가장 두드러질 수밖에 없다. 한 픽셀 안에 정말 많은 텍셀이 우겨들어간다면, Linear Filtering도 의미가 없어지기 때문이다.  이렇게 골칫거리인 Minification 문제를 해결하기 위한 것이, Mipmap이다. Mipmap이란, 미리 텍스쳐 이미지를 축소하여 모아놓은 것이다.여기서 축소란, resolution을 줄였다고 생각하면 된다.  원래 Minification..

OpenGL/공부 2024.06.06

[OpenGL] Textures (1) - 개요, Texture Filtering (Nearest, Linear)

텍스쳐는 오브젝트에 붙일 수 있는 일종의 스티커라고 이야기할 수 있다. 일반적으로 2D 이미지 파일을 사용한다.(일부 경우에는 3D 텍스쳐를 쓰기도 한다. (언리얼 엔진의 volumetric fog 등))  텍스쳐는 위와 같이 (0,0) ~ (1,1) 범위의 좌표계를 사용하며, 보통 x축을 S, y축을 T라고 표현한다. 또한 텍스쳐는 이미지 파일이기 때문에 그 자체로도 픽셀을 가지는데, 이를 텍셀(texel)이라고 칭한다.후술하겠지만, 이 텍셀로 인해 골치아픈 일이 많이 발생한다. 텍스쳐를 오브젝트에 칠할 때는, 우선 모델의 각 버텍스에 텍스쳐 좌표를 지정해준다.예를들면 삼각형 모양의 모델이 존재하고, 각 버텍스의 텍스쳐 좌표가 (0, 1), (1, 0), (0, 0)이라고 하자. Vertex Shade..

OpenGL/공부 2024.06.06

[OpenGL] 카메라 구현, 키보드/마우스를 통한 조작

키보드/마우스를 통해 카메라를 조작하며 물체를 볼 수 있는, 일종의 뷰어 프로그램을 만들 것이다.  카메라를 다루기 전에, GLFW가 받은 인풋을 먼저 처리하는 것은 Window가 될 예정이다. 따라서 Window 클래스에 대해 먼저 살펴보고자 한다.  현재 Window 클래스는 다음과 같다. (이론적인 내용 없는 단순 코딩이므로 접어둠)더보기Window.h:#pragma once#include #include #include class Window{public: /* (생략) */ bool* getsKeys(){return keys;} // 키보드 입력 현황 GLfloat getXChange(); // 마우스 위치의 x축 변화 GLfloat getYChange(); // 마우스 위치의 y축 변화 ..

OpenGL/공부 2024.06.01

[OpenGL] Projection Matrix (glm::perspective, glm::ortho)

지난 포스팅에서 ModelView Matrix를 통해 물체의 버텍스의 좌표를 Object Space에서 View Space로 바꾸는 것까지 하였다. 이번엔 View Space 기준 좌표를 Clip Space 기준 좌표로 변환할 것이며, Projection Matrix가 이 역할을 해준다.  우선 배경 설명을 먼저 하자면, 그래픽스에서 카메라의 Projection은 주로 두 가지 타입으로 나뉜다.하나는 Perspective, 하나는 Orthographic이다. 유니티 엔진을 다뤄보신 분들이라면 익숙할 것이다. Orthographic은 주로 2D 어플리케이션에서 사용되고, Perspective는 주로 3D 어플리케이션에서 사용된다. 간단히 말하자면 Perspective는 원근감을 반영한 것, Orthogra..

OpenGL/공부 2024.06.01