반응형
OpenGL Shader는 아래의 순서를 통해 생성된다.
Vertex란, 그래픽 파이프라인의 입력 및 좌표를 나타내며, 정점 데이터라고 불린다.
Vertex는 [-1.0 ~ 1.0] 사이의 값을 나타내며, 3D 좌표계이기 때문에 Float 타입으로 구성된다.
- Vertex Shader - 입력받은 정점 정보를 3D 좌표로 변환
- Shape Assembly - 모든 정점 정보들을 구성 및 재조립
- Geometry Shader - 구성 및 재조립된 정점들로 새로운 정점들로 변환하여, Shape Assembly와 같은 과정을 거침
- Rasterization - 픽셀과 매핑 및 Window의 범위를 벗어나는 픽셀을 제거(Clipping)
- Fragment Shader - 픽셀의 최종 컬러값 계산
- Test And Blending - 픽셀의 깊이와 투명도 및 실질적인 렌더링
Shader란, 그래픽 파이프라인의 각 단계에서 GPU가 실행시키는 프로그램들 혹은 프로세싱 코어를 의미한다.
Vertex Shader를 사용하여 Window에 렌더링 되는 과정을 아래와 같다.
- Vertex, Geometry, Fragment Shader & Shader Program 생성 및 설정
- Vertex, Geometry Fragment Shader를 Shader Program으로 Link
- 사용이 완료된 Shader 메모리 해제
- VAO & VBO 생성 및 초기화
- VAO 및 VBO 초기화 및 Binding
- 정점 데이터 입력
- Vertex 속성 포인터 및 상태 설정
- Render Loop를 통한 Rendering
- 사용할 Shader Program 설정
- VAO Binding
- Draw 함수를 이용하여 Rendering
- 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 |