-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 도입(정밀 한정자.)
- 전력 소비 줄이고 셰이더 성능 증가를 위함.
- precision qualifier 도입(정밀 한정자.)
- handheld장치의 경우, 화면 크기가 제한되어 화면에 그려진 픽셀 품질 우수했어야 함.
- shadow mapping, volume rendering, GPU-based particle animation, geometry instancing, texture compression, gamma correction과 같은 기능들이 추가.
- OPENGL에서 redundancy 제거.(중복성)
- 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 variables

- 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에 색상 값을 저장한 결과로 발생하는 아티팩트 최소화.
- pixel ownership test
- 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에서 픽셀을 다시 읽을 수 있는 인터페이스 제공.
'OSS' 카테고리의 다른 글
OpenGL ES 3.0 스터디 5주차 공부자료 (0) | 2023.08.21 |
---|---|
OSS 8월 회고 후기 (0) | 2023.08.16 |
OpenGL ES 3.0 스터디 4주차 공부자료 (0) | 2023.08.14 |
OpenGL ES 3.0 스터디 3주차 공부자료 (0) | 2023.08.07 |
OpenGL ES 3.0 스터디 2주차 공부자료 (0) | 2023.08.01 |