본문 바로가기
OSS

OpenGL ES 3.0 스터디 1주차 공부자료

by mazayong 2023. 7. 29.

-1장은 소개여서 해당 내용 중 그래픽스 파이프라인 내용을 위주로 정리하였다.-

 

0.간단한 소개

  • OPENGL ES: 임베디드 시스템용 OPENGL
    • OPENGL: 발전된 3D 그래픽용 API.
    • iOS, Android, UNIX, Linux, MAC OS X, Window, WebGL 등 다양한 플랫폼에서 사용 가능.
  • OPENGL ES의 특징
    • OPENGL에서 redundancy 제거.(중복성)
      • vertex array만 존재. (immediate mode, display list 제거)
    • OPENGL에 포함된 기능들을 OPENGL ES에서도 실행할 수 있도록 함.
      • OPENGL과의 호환성 유지를 위함.
    • 특정 제약을 해결하기 위한 기능 추가.(Handheld & embedded issue)
      • precision qualifier 도입(정밀 한정자.)
        • 전력 소비 줄이고 셰이더 성능 증가를 위함.
    • handheld장치의 경우, 화면 크기가 제한되어 화면에 그려진 픽셀 품질 우수했어야 함.
    • shadow mapping, volume rendering, GPU-based particle animation, geometry instancing, texture compression, gamma correction과 같은 기능들이 추가.
  1. OPENGL ES 3.0 pipeline
  • OPENGL 3.0 API 사양 + OPENGL ES Shading Language 사양

 

 

1.1 Vertex Shader

  • Vertices에서 작동 위한 효율적 방법 구현.
  • Input
    • Shader Program
    • Vertex shader / vertex arrays
    • Uniforms
      • vertex에서 사용하는 상수 데이터
    • Samplers
      • vertex shader에서 사용하는 특정 타입의 uniform.
  • Output
    • vertex shader variables
      • primitive rasterization의 경우, 생성된 각 조각의 fragment에 의해 계산되고 fragment shader에 대한 입력으로 다시 전달.
      • interpolation: 각 vertex에 할당된 vertex shader output에서 각 fragment에 대한 값을 생성하는데 사용되는 매커니즘
      • Add transform feedback: vertex shader 출력을 출력 버퍼에 선택적으로 사용 가능.(fragment shader skip or with fragment shader)
        • transform feedback ex: 입자가 buffer object로 출력되는 입자 시스템 vertex shader에서 구현 가능.
        • 기존 vertex-vased operation 사용 가능.
        • matrix에 의한 transforming the position, 조명 방정식 계산(vertex별 색상 생성), 텍스쳐 좌표 생성.
      • vertex shader는 application에 의해 특정됨
        • 기존 tranditional fixed-function pipelines에서 허용되지 않는 새 transform, lighting, vertex-based활성화시키는 custom math 사용 가능.
      <vertex shader input & output>

 

 

  • input: position, associated color data
  • 4*4 matrix로 위치 변환 및 변환된 위치 및 색상 출력.
    • 왜 4*4지?

 

 

1.2. Primitive Assembly

  • primitive: geometric object(triangle, line, point sprite..etc)
    • 각 vertex은 vertex shader의 다른 복사본으로 전송.
  • 해당 과정 중 vertex들은 다시 그룹화됨.
  • 각 primitive가 view frustum(화면에 표시되는 3d 공간 영역)에 있는지 결정해야 함.
    • view frustum 내부에 완전히 포함되지 않은 경우, 해당 primitive는 view frustum 내부에 있는 것만 남고 나머지는 삭제.(=Clipping)
  • 위 과정을 통해 view frustum 내부에 남는 primitive만 남겼을 때, vertex position → screen coordinates 변환.
  • Clipping 후 Culling 작업 하기도 함.(face forward / backward?에 따라. A culling operation can also be performed that discards primitives based on whether they face forward or backward. )

 

1.3 Rasterization

  • Rasterization: Primitive를 2차원 fragment(화면에 그릴 수 있는 픽셀) 집합으로 변환→fragment shader에서 처리.

 

 

1.4. Fragment Shader

  • Fragments에서 작동하기 위한 general-purpose programmable method 구현.
  • rasterization된 각 fragments들에 의해 실행, 다음 입력을 받음.
    • shader program : fragment에서 수행될 작업을 설명하는 소스 코드/실행 파일
    • input variables : interpolation을 사용해 각 조각에 대해 rasterization으로 생성되는 vertex shader 출력.
    • uniforms : fragment(or vertex) shader에서 나오는 상수 데이터.
    • Sampler : 조각 셰이더에서 사용하는 텍스쳐를 나타내는 특정 유형의 uniform
  • fragment discard / output이라는 1개 이상 출력값 생성
    • 일반적으로 여러 개의 renderer targets일 때 제외하면 단일 색상값 출력
    • 이 output = rasterization 단계에서 생성된 색상, depth, stencil, 화면 좌표 위치(xw, yw)가 input인 결과, opengl es 3.0 pipeline의 fragment operations stage가 됨.

 

 

 

1.5 Per-Fragment Operations

  • fragment별 operation
  • (xw, yw) 스크린 좌표에서 rasterization된 fragment는 framebuffer의 위치 (xw, yw)에 있는 픽셀만 수정 가능.
  • 각 fragment에서 해당 기능 수행
    • pixel ownership test
      • framebuffer의 위치(xw, yw)에 있는 픽셀이 현재 opengl es에서 소유하고 있는지 확인.
      • 현재 opengl es context에 속하는 framebuffer 내부의 픽셀 제어 가능.(윈도우 시스템이 수행할 수 있는 기능)
      • example
        • OpenGL ES 프레임 버퍼 창을 표시하는 창이 다른 창에 의해 가려지면 창 시스템은 가려진 픽셀이 OpenGL ES 컨텍스트의 소유가 아니라고 판단할 수 있으므로 픽셀이 전혀 표시되지 않을 수 있습니다.
    • Scissor test
      • (xw, yw)가 opengl es상태 일부로 정의된 scissor rectangle 내부에 존재하는지 여부 결정. 조각이 scissor region 밖에 있으면 fragment 제거됨.
    • Stencil and depth test
      • 들어오는 fragment의 stencil, depth값에서 수행되어 조각을 거부해야하는지 여부 결정.
    • Blending
      • 생성된 조각 색상 값을 위치 (xw, yw)의 frame buffer에 저장된 색상 값과 결합.
    • Dithering
      • 제한된 정밀도를 사용해 frame buffere에 색상 값을 저장한 결과로 발생하는 아티팩트 최소화.
  • per-fragment 단계가 끝나면 fragment가 거부 / fragment color, depth, stencil value가 위치 (xw, yw)의 frame buffer에 기록됨.
  • fragment color, depth, stencil values는 적절한 write mask가 활성화되었는지 여부에 따라 다름.
  • Write mask를 사용하면 연결된 버퍼에 기록된 color, depth, stencil values를 세밀하게 제어 가능.
  • opengl es 3.0은 frame buffer에서 픽셀을 다시 읽을 수 있는 인터페이스 제공.