Shader

물체의 Shading을 할 때 GPU에서 돌리는 프로그램이다.
Shading은 가상의 3D 공간에서 물체의 표면, 색, 빛, 카메라, 재질 등을 표현하기 위해 설정하는 다양한 설정값들을 바탕으로 표현하는 과정을 의미한다.


OpenGL Shader Language(GLSL)

C언어를 기반으로 하며 OpenGL에서 사용하는 Shading 언어다.
Types는 기본적인 것들은 대부분 갖고 있으며 Vector, Matrices가 있다.

실제로 OpenGL을 이용해서 무언가를 그리기 위해선 Vertex Shader, Fragment Shader가 필요하다.
그리고 OpenGL은 실제로 점, 선, 삼각형밖에 그리질 못하고 이것을 우리는 프리미티브(Primitive)라고 한다.

3D 모델링을 위해 폴리곤이라는 것을 검색해보면 많은 수의 삼각형 또는 사각형 등으로 조각조각되어있다.
우리는 그 삼각형 또는 사각형 조각 하나를 프리미티브라고 부른다.
즉, 3D 모델은 수많은 프리미티브를 조합한 것이다.

프리미티브는 실제로 주어진 정점에 따라 도형을 그린다는 것에 초점을 둔다.
정점이 1개면 점, 2개면 선, 3개면 삼각형인 것이다.
그렇다면 우리는 정점들의 정보를 갖고 다양한 색을 표현하여 모델을 그린다는 것을 알 수 있다.


Vertex Shader

OpenGL은 Vertex Shader로 해당하는 정점의 정보를 어떤 정보인지 확인해서 넘겨준다. [layout]
하지만 정점 정보만 받는 것이 아니라, 받은 정점의 정보에 변동점(공간 데이터)을 주는 정보도 받는다. [Uniform]
이렇게 받은 두 종류의 정보를 이용하여 Vertex Shader는 정점의 정보를 건네준다. [out]

Rasterization

Vertex Shader에서 건네주는 정보들은 OpenGL에서 일련의 과정에서 프리미티브가 생성되어 픽셀당의 데이터로 표현한다.
이렇게 픽셀당 데이터로 표현하기 위해서 지정한 개수의 정점들을 보간하여 픽셀의 데이터를 정한다.

Fragment Shader

그렇게 프리미티브는 픽셀의 정보들로 변환되어 Fragment Shader에 보내진다.
그리고 픽셀들의 정보들과 OpenGL로부터 받은 빛, 텍스쳐의 정보를 이용하여 색을 적용시킨다.
결과적으로 픽셀의 값들을 Frame Buffer로 전달된다.

이후는 여러 가지 테스트들이 실행된다. 사실 위 세 가지 과정 사이에도 몇 가지 과정들이 숨어있는데 이후에 정리해야겠다.


VAO & VBO & EBO

우리가 Vertex Shader에 정점의 정보를 전달할 때, OpenGL에서는 VAO(Vertex Array Object), VBO(Vertex Buffer Object), EBO(Element Buffer Object)를 이용해서 전달한다.

VBO는 정점의 정보를 담고 있는 배열의 객체이다. 해당 배열에는 정점의 정보를 넣는 순서대로 들어간다.
VAO는 여러 개의 VBO를 바인드 받아서 저장하고 있는 객체이다.
그리고 VBO에 지정된 순서대로 Vertex Shader로 들어간다.

여기서 EBO가 있는 이유는 중복 데이터 제거의 용도인데, 이는 예시를 들어 이해하는 것이 빠르다.

VBO

위의 같은 경우엔 6개의 정점을 선언했지만 따지고 보면 1,5와 2,3의 정점은 똑같은 정점이 된다.
즉, 선언은 6개, 사용은 4개인 것으로 2개의 정점의 자원이 낭비된다는 것이다.

 

EBO

해당 VBO는 4개의 정점을 선언하고, EBO에 정점의 순서를 지정한 것이 된다.
이렇게 진행했을 경우엔 낭비되는 자원이 없다.

'OpenGL' 카테고리의 다른 글

OpenGL[Lighting]  (0) 2022.10.18
OpenGL[Coordinate System]  (0) 2022.10.18
OpenGL[02](First Triangle)  (1) 2022.10.12
OpenGL[00](First Window)  (0) 2022.10.12
vcpkg를 이용한 GLFW, GLM, ASSIMP, GLAD setup  (0) 2022.10.06

+ Recent posts