3. Advanced Shader

후이재·2020년 10월 14일
1
post-thumbnail

Advanced Shader

  • 이번에 고급컴퓨터그래픽스를 수강하면서 Tessellation Shader를 처음 접하게 되었다. Geometry Shader는 김교수님의 컴퓨터그래픽스 방학 심화강의를 들으며 알게 되었었다.
  • Unreal엔진을 이용하면서 Quixel의 나무Asset의 Metarial 구현 부분에서 Tessellation을 제어하면 나무텍스쳐의 움직임을 제어할 수 있던데 이게 그 부분인가보다 싶었다. 강의를 들어보니 애니메이션하시는 분들에게 큰 도움이 되고있다고 한다. 가볍게 애니메이션을 처리할 수 있다고 한다.
  • 나는 그 움직이는 부분이 그래픽 렌더링에서 과부하가 생길봐 아예 제거를 했는데 GPU에 무리를 주지 않는다고 한다. 호오. 신기하다.
  • 쨋든. 너무 길어지기전에 GeometryShader부터 시작한다.

Geometry Shder

  • OpenGL 3.2부터
  • VertexShader다음에 실행되는 Shader
  • Primitive단위로 vertices를 받아온다.(Assembled geometry를 받아온다)
  • 주 기능: primitives, vertices를 추가, 삭제 가능하다/ Vertex position의 수정이 가능하다.
  • 이게 있다고 Vertex Shader를 대체할 수 있는것은 아니다. 반드시 있어야한다.

Programming

  • 변수의 전달은 Uniform 변수, in, out변수로 이루어진다.
  • 다른점은 layout 변수를 쓴다는것.
  • 삼각형을 가져오고 점을 3개 가진 triangle_strip으로 내보낼 경우
    layout (triangle) in; // Points, Line, Line Adjacency, Triangle, Triangle Adjacencty 가능
    layout (triangle_strip, max_vertices = 3) out; // Points, LineStrips, TriangleStrips 가능
  • 이 경우, 모든 in 변수는 가져온 primitive의 vertices만큼 배열로 들어온다.
    in float light[3]; // 이런식으로 선언해줘야한다.
    gl_in[0].gl_Position.xyz // gl_in도 배열로 처리한다.
  • built-In 변수: gl_PrimitiveID 는 Primitive의 몇번째 점인지에 대한 ID값.
  • EmiVertex()와 EndPrimitive()가 있다.
    EmitVertex()는 말 그대로 점을 생성한다. 이 점을 primitive를 만들 때 쓰겠다는 것.
    EndPrimitive()는 받은 점으로 primitive를 만들어보낸다는 것. 위 예시에서는 삼각형 strip을 만들어 보낸다.
  • Interpolation Qualifier
    Smooth, noperspective, flat이 있다. 이름처럼 보간을 부드럽게, screen space에서, 불연속으로 진행한다.

Line Adjacency

  • 4개의 점을 주면 4개를 묶어서 primitive로 보내준다. geometry에서 4개의 점을 처리할 수 있다.
  • Spline을 위한 input이라 할 수 있다.
  • Line Strip Adjacency는 geometry Shader의 output값으로 주로 사용된다.

Tessellation Shader

  • Tessellation: mosaic으로부터 기원됨. polygons 사이에 간격과 겹침이 없는것이 특징.
  • 단순한 형태를 디테일하게 만들어 줄 수 있는 기특한 셰이더
  • Tesselated model에서 Displacement mapping을 진행하면 texture에 따라 굴곡을 만들수도 있다.

Dymamic Terrain Rendering

  • 단순한 Primitive의 지형을 Tessellation을 통해 복잡하게 만들 수 있다. 900polygon이 1,000,000개의 polygon으로 재탄생 가능하다.

Instanced Tessellation

  • 단순모형을 부드럽게 표현 가능=> 적은 점으로 섬세함 표현 가능
  • displacement map으로 재미있는 표현 가능
  • 애니메이션 작업 시, 움직여야하는 점의 개수를 줄임으로 작업을 편리하게

Patch primitive

  • Tessellation Shader에서 유일하게 입력 가능한 primitive종류. control point로 구성되어있음
  • Bezier, B-Spline, NURBS 에 대한 Basis로 계산 => 곡면또는 곡선 생성
  • (u, v)좌표를 가짐. u = [0, 1], v = [0, 1]
  • TessFactor로 0~1사이를 나눔 4이면 4구간으로 나누어짐.
  • Patch의 나누어짐에 따라 LOD정의 가능. 멀리=> 단순하게, 가까이=> 자세하게
  • Patch의 종류: quads(사각형), isolines(선), triangles(삼각형)

Programming

  • Tessellation 과정을 수행하는 Shader는 무려 2개~!

그 전에 main.cpp에서...

  • 4개의 control point일때
  • glPatchParameteri(GL_PATCH_VERTICES, 4);// <- 하나의 patch를 구성하는 control point의 개수
  • glDrawArrays(GL_PATCHES, 0, 4);// 전체 그리기에 사용할 control point 수

Tessellation Control Shader(TCS)

  • 몇개로 나눌지를 정의
  • gl_TessLevelOuter[]: 외부로 나누어질 구간 개수
  • gl_TessLevelInner[]: 내부로 나누어질 구간 개수
  • quad는 outer 4개(l,d,r,u), inner 2개(l,u)
  • triangle은 outer 3개(l,d,r), inner 1개(d)
  • isoline은 outer 2개(l, d), inner 0개
layout(vertices = 4) out;

gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
gl_TessLevelOuter[0] = 1;
gl_TessLevelOuter[1] = uOuter1;

이 사이에는 Tessellation Primitive Generator(TPG)가 있다

Tessellation Evaluation Shader(TES)

  • 실제 patch에서의 점 위치 계산
  • 여기서 u에 대한 계산을 진행하면 된다.
layout(ioslines, equal_spacing) in;
vec4 p0 = gl_in[0].gl_Position;
gl_Position = b0 * p0;
profile
공부를 위한 벨로그

0개의 댓글