일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- qtspim stack
- 하나의 솔루션
- git
- fetching
- 정의
- vertexarrayobject
- multi process
- turingmachine
- glDrawArrays
- glfw
- 프로젝트 여러개
- 자동판결
- visualstudip
- vertex sahder
- fragment
- 솔루션에프로젝트추가
- 시작
- 튜링기계
- .sln
- 멀티프로세스
- interface block
- OpenGL
- VAO
- shader
- Qtspim
- 수리명제
- 파일생성 명령어
- vertex
- superbible
- Tutorial
- Today
- Total
공사중
[SB] Tesellation Control Shader 본문
[SB] Tesellation Control Shader
행운개발자 LuckyDeveloper 2019. 3. 4. 10:06- 버텍스 패치
- 버텍스 쉐이더
- 테셀레이션 컨트롤 쉐이더
- 테셀레이션
- 테셀레이션 이벨류에이션 쉐이더
- 지오메트리 쉐이더
- 래스터라이제이션
- 프래그먼트 쉐이더
- 프레임버퍼 동작
Tessellation : 조각화
tesellation은 고차 primitive(openGL에서는 patch라고도 함)을 여러 개의 rendering이 가능한 primitive로 분할하는 작업입니다. 위 순서도에서 볼 수 있듯이 세 개의 단계로 구성됩니다.
Tessellation Control Shader
tesellation control shader 쉐이더는 vertex shader로부터 입력을 받아서 주로 두 가지 일을 진행합니다.
- tesellation engine에 보낼 tesellatino level을 결정한다. (engine에 보내는 결과 patch에 대한 tesellation 인자를 설정하는 일)
- tesellation이 수행된 다음이 실행되는 테셀레이션 이벨류에이션 쉐이더에 보낼 데이터를 생성한다. (출력 제어점의 값 계산)
glPatchparameteri() glPatchParameteri(GLenum pname, GLint value);
기본적으로 patch 당 제어점 개수는 3개입니다. 이 값을 원하면 위 함수를 호출할 필요가 없습니다. tesellation이 활성화될 떄, vertex shader는 제어점 당 한 번씩 수행되며, tesellation control shader는 그룹에 대해 batch(일괄적으)로 수행됩니다. 이때 각 배치(batch, 일괄)의 크기는 patch당 vertex 갯수와 동일합니다. 즉, 버텍스들이 제어점으로 사용되며, vertex shader의 결과는 batch 형태로 tesellation control shader의 입력으로 전달됩니다. patch당 제어점의 갯수는 변경이 가능하기 떄문에 tesellation control shader가 출력하는 제어점의 갯수는 소비하는 제어점의 갯수와 다를 수 있습니다. 컨트롤 쉐이더가 생산하는 제어점 개수는 컨트롤 쉐이더 소스 코드에서 아래와 같이 지정합니다.
//tesellation shdaer #versino 430 core layout(vertices = N) out; void main(void) { if (gl_InvocationID == 0) { gl_TessLevelInner[0] = 5.0; gl_TessLevelOuter[0] = 5.0; gl_TessLevelOuter[1] = 5.0; gl_TessLevelOuter[2] = 5.0; } gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; }
여기서 N은 patch당 제어점 개수입니다. tesellation control shader의 출력인자는 내장변수 gl_TessLevelInner와 gl_TessLevelOuter에 저장됩니다. 위 코드는 내부 및 외부 테셀레이션 레벨을 5레벨로 지정한 것이며, 레벨이 높을 수록
patch라고 불리는 고차원 surface가 기본 primitive 점, 선, 삼각형으로 작게 쪼개집니다. (위 사진 참고) 그리고 gl_out과 gl_in을 사용해서 파이프라인으로 전해지는 다른 데이터들이 저장됩니다. 이것들이 위에서 말했던 tessellation control shader의 두 가지 역할에 각각 해당합니다. gl_InvocationID는 tesellation control shader의 현재 호출에 의해 처리되는 0부터 시작하는 index 입니다.
Tessellation Engine
정확히 말하면 위 사진에서 patch가 기본 primitive로 tessellation 되는 것은 이 곳에서 일어납니다. control shader는 입려된 patch의 제어점을 처리하고, tesellation level을 정의하는 것까지만 합니다. 그리고 나서 tessellation engine이 patch를 쪼갠 다음, 출력 primitive들을 생성합니다. 이 값들은 다음 과정인 tesselation evaluation shader로 전달됩니다.
Tessellation Evaluation Shader(TES)
이전 단계인 고정 함수 tessellation engine이 수행되면 생성된 primitive들에 대한 여러 출력 vertex들이 생깁니다. 큰 patch가 작은 삼각형들로 나뉘면 당연히 여러개의 vertex가 생깁니다. evaluation shader는 이 vertex들을 입력으로 받습니다. 만약 tessellation level이 너무 높으면 너무 많은 vertex들이 TES에 전달됩니다. TES는 전달된 vertex마다 한 번씩 호출되기 때문에 너무 높은 level을 지정하면 성능에 영향을 받습니다. 아래 코드는 위에서 작성한 control shader의 출력값을 받은 engine이 출력한 vertex들을 입력으로 받는 TES의 모습입니다.
//Tessellation Evaluation Shader #version 430 core layout(triangles, equal_spacing, cw) in; void main(void) { gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position + gl_TessCoord.y * gl_in[1].gl_Position + gl_TessCoord.z * gl_in[2].gl_Position); }
- triangle은 tessellation mode를 설정하는 역할을 합니다.
- equal_spacing는 tessellation 된 Polygon(다각형) 가장자리를 따라 동일한 간격으로 verte들이 생성되도록 하는 옵션입니다.
- cw는 시계 방향 버텍스 감기 순서를 사용하여 삼각형을 생성하도록 하는 옵션입니다.
- gl_TessCoord는 tessellator가 생성한 vertex의 무게중심 좌표입니다.
- gl_in은 이전 shader에서 gl_out으로 저장된 값이 전달된 것입니다.
void glPolygonMode(GLenum face, GLenum mode); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
각 인자는 어떤 타입의 polygon에 적용하는지 여부와 폴리곤이 어떤 모습으로 그려질지를 결정합니다.
'개발 | OpenGL > OpenGL Super Bible' 카테고리의 다른 글
[SB]Vertex fetch, Vertex shader, shader 간 데이터 전달(in/out) (0) | 2019.03.02 |
---|---|
[SB] window에 삼각형 그리기 (0) | 2019.03.01 |
[SB] 예제 프로젝트 빌드와 실행해보기 (1) | 2019.02.27 |
[SB] 전체적인 흐름 짚어보기 (0) | 2019.02.26 |
[SB] 들어가기 (0) | 2019.02.25 |