반응형

OpenGL Shader는 아래의 순서를 통해 생성된다.

Vertex란, 그래픽 파이프라인의 입력 및 좌표를 나타내며, 정점 데이터라고 불린다.

Vertex는 [-1.0 ~ 1.0] 사이의 값을 나타내며, 3D 좌표계이기 때문에 Float 타입으로 구성된다.

  1. Vertex Shader - 입력받은 정점 정보를 3D 좌표로 변환
  2. Shape Assembly - 모든 정점 정보들을 구성 및 재조립
  3. Geometry Shader - 구성 및 재조립된 정점들로 새로운 정점들로 변환하여, Shape Assembly와 같은 과정을 거침
  4. Rasterization - 픽셀과 매핑 및 Window의 범위를 벗어나는 픽셀을 제거(Clipping)
  5. Fragment Shader - 픽셀의 최종 컬러값 계산
  6. Test And Blending - 픽셀의 깊이와 투명도 및 실질적인 렌더링

Shader란, 그래픽 파이프라인의 각 단계에서 GPU가 실행시키는 프로그램들 혹은 프로세싱 코어를 의미한다.

Vertex Shader를 사용하여 Window에 렌더링 되는 과정을 아래와 같다.

  1. Vertex, Geometry, Fragment Shader & Shader Program 생성 및 설정
    1. Vertex, Geometry Fragment Shader를 Shader Program으로 Link
    2. 사용이 완료된 Shader 메모리 해제
  2. VAO & VBO 생성 및 초기화
    1. VAO 및 VBO 초기화 및 Binding
    2. 정점 데이터 입력
    3. Vertex 속성 포인터 및 상태 설정
  3. Render Loop를 통한 Rendering
    1. 사용할 Shader Program 설정
    2. VAO Binding
    3. Draw 함수를 이용하여 Rendering
  4. VAO & VBO 메모리 해제

기본적인 Rendering 순서는 위와 같다.

 

 

Vertex, Geometry, Fragment Shader는 C와 같은 형식으로 되어 있지만, OpenGL만의 코딩 규약을 가진다.

Shader는 문자열로 사용되며, Shader Program으로 Link되면서 Compile된다.

#version 330 core

void main()
{

}

version은 OpenGL의 사용 버전을 말하며, 3.3을 사용하여 진행하기 때문에 330을 사용한 것이다.

그 외의 것은 C의 기본 형태를 그대로 사용한다.

 

실제 문자열로 입력받을 때에는 다음과 같이 받는다.

const char* vertexShaderSource =
"#version 330 core\n"
"void main()\n"
"{\n"
"}\0";

Shader를 사용할 때에는 문자열로 받기 때문에, 프로그래머가 직접 사용할 때에는 작성 및 독해가 어렵다.

때문에 Shader를 cpp파일과 같이 다른 파일로 작성한 후, 해당 파일을 문자열로 읽어서 사용하는 방식을 사용한다.

 

해당 튜토리얼에서는 각 파일에 대하여 아래의 확장자를 사용한다.
Vertex Shader - *.vs

Geometry Shader - *.gs

Fragment Shader - *.fs

반응형

'게임 개발 끄적 > OpenGL' 카테고리의 다른 글

[OpenGL] Shader File  (0) 2020.02.07
[OpenGL] Shader Program  (0) 2019.11.04
[OpenGL] 기본 코드 이해  (0) 2019.10.14
[OpenGL] 환경 설정 구축  (0) 2019.10.14

+ Recent posts