Software Development/Graphics

OpenGL Super Bible 그래픽스 공부하기 - 3. 파이프라인 따라가기 - 3) 지오메트리 쉐이더

huiyu 2018. 1. 21. 12:04

OpenGL Super Bible 그래픽스 공부하기 - 1. OpenGL 기본개념이해
OpenGL Super Bible 그래픽스 공부하기 - 2. 첫번째 OpenGL 프로그램
OpenGL Super Bible 그래픽스 공부하기 - 2-3. 처음 그리는 삼각형
OpenGL Super Bible 그래픽스 공부하기 - 3. 파이프라인 따라가기 - 1) 쉐이더간 데이터 전달
OpenGL Super Bible 그래픽스 공부하기 - 3. 파이프라인 따라가기 - 2) 테셀레이션


Part 3 파이프라인 따라가기 - 3) 지오메트리 쉐이더

 3.4 지오메트리 쉐이더

 

- 래스터라이저 스테이지 이전 단계에 위치, 개념적으로 마지막 쉐이더 스테이지
- 프리미티브당 한 번 수행되며, 수행되는 프리미티브를 구성하는 모든 버텍스에 대한 입력 버텍스 데이터에 접근 가능
- 프로그래밍을 통해 파이프라인 내 데이터 흐름의 양을 증가시키거나 감소시킬 수 있는 유일한 쉐이더
  * 테셀레이션 쉐이더도 테셀레이션 레벨을 통해 암묵적으로 가능하지만,
   지오메트리 쉐이더는 EmitVertex(), EndPrimitive()를 통해 명시적으로 가능
- 중간에 프리미티브 모드 변경 기능, 예를들어 삼각형들을 입력으로 하여 여러 점이나 선을 출력으로 만들 수 있다.

*버텍스를 확인할 수 있게 삼각형을 점으로 변환하는 지오메트리 쉐이더 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#version 430 core
 
layout (triangles) in;
layout (points, max_vertices = 3) out;
 
void main(void)
{
    int i;
 
    for (i = 0; i < gl_in.length(); i++)
    {
        gl_Position = gl_in[i].gl_Position;
        EmitVertex();
    }
}
cs

 - layout (triangles) in : 삼각형을 입력으로 받는다.
 - layout (points, max_vertices = 3) : 지오메트리 쉐이더가 점을 생성 시 각 생성하는 점의 갯수의 최대가 3이라는 것을 알린다.
 - gl_in.length() : gl_in 배열의 멤버를 루프를 돌면서 수행, 배열의 크기를 알 수 있다.
 - EmitVertex() : 지오메트리 쉐이더의 출력으로 점을 생성, 자동적으로 EndPrimitive()를 호출하여, 명시적으로 호출할 필요 없다.

728x90