Post Lists

2019년 2월 20일 수요일

OpenGL Rasterization 명세 번역

취업을 위해 필기테스트를 보았는데, Rasterization의 알고리즘을 물어보는 문제가 나왔다.
나는 이 부분을 자세히 공부한 적이 없었기 때문에, 들어본 알고리즘을 선택했는데 틀렸다.
그래서 모르는 것을 정리하기 위해 여기서 OpenGL 3.3 명세에서 Rasterization 부분을 번역한다.

Chapter 3
Rasterization
Rasterization(Rz)은 한 primitive가 이차원 이미지로 변환되는 프로세스이다. 이 이미지의 각 point는 color와 depth 같은 정보를 포함한다. 따라서, 한 primitive를 rasterizing하는 것은 두 부분으로 구성된다. 그 첫 번째는 window 좌표에서 한 정수 grid의 어떤 squares가 그 primitive에의해서 채워져야 하는지를 결정하는 것이다. 그 두 번째는 한 depth value와 한 개 이상의 color values가 각 그러한 square에 할당하는 것이다. 이 프로세스의 결과들은 GL의 다음 단계로 넘겨진다 (per-fragment operations), 그리고 그 fragment shader 단계는 framebuffer에서 적절한 위치를 업데이트 하기 위해 그 정보를 사용한다. 그림 3.1은 그 rasterization process를 그린다. 한 fragment에 할당된 color values는 section 3.9에정의된 fragment shader로서 결정된다. 최종 depth value는 초기에 rasterization operations에 의해 결정되고, fragment shader에 의해 수정되거나 교체될지도 모른다. 한 point, line, or polygon을 rasterizing한 것의 결과들은 fragment shader를 통해 보내진다.

grid square의 z (depth)와 다양한 shader output parameters를 가진 grid square는 한 fragment라고 불려진다; 그 파라미터들은 종합적으로 그 fragment의 관련된 데이터가 덧 붙여진다. 한 fragment는 그것의 lower left corner에 위치해 있고, 그것은 integer grid coordinates 에 놓여있다. Rasterization operations은 또한 한 fragment의 center를 지칭하고, 그것은 그것의 lower left corner로 부터 (1/2, 1/2) 정도 offset한 것이다 (그리고 half-integer coordinates에 놓여있다).

Grid squares는 실제로 GL에서 square일 필요가 없다. Rasterization 규칙들은 grid squares의 실제 aspect ratio에 의해 영향 받지 않는다. 그러나, non-square grids의 Display는 rasterized points와 line segments가 다른 것 보다 한 방향에서 더 뚱뚱하게 보이게 만들 것이다. 우리는 fragments가 square라고 가정한느데, 그것이 antialiasing과 texturing을 간단하게 만들기 때문이다.

몇 가지 요소들이 rasterization에영향을 미친다. Primitives는 rasterization 전에 버려질지도 모른다. Points은 다른 diameters와 line segments가 다른widths가 주어질지도 모른다. 한 point, line segment, or polygon은 antialiased될지도 모른다.

3.1 Discarding Primitives Before Rasterization
Primitives는 선택적으로 RASTERIZER_DISCARD를 Enable and Disable을 호출하여 rasterization전에 버려질 수 있다. 활성화 되었을 때, primitives는 rasterization stage전에 즉시 버려진다. 그러나 optional transform feedback stage (see section 2.16) 후에 된다. disabled 될 때, primitives는 정상적으로 처리될 rasterization stage에 넘겨진다. 활성화될 때, RASTERIZER_DISCARD는 Clear and ClearBuffer commands가 무시되도록 한다.


3.2 Invariance
한 primitive p를 x와 y가 정수인 윈도우 좌표에서 offset(x,y)만큼 평행이동 시켜진 한 primitive p'를 고려하자. p' 뿐만 아니라 p가 clipped 되지 않는 한, f'의 중앙이 f의 center로부터 (x, y)에 의해 이동된 것을 제외하고 p'에의해 만들어진 각 fragment f'는 p로부터 대응되는 fragment f와 동일하다.

3.3 Antialiasing
rasterized fragment의 RGB 값들은 영향받지 않게 되지만, A 값은 fragment의 screen pixel coverage를 설명하는 [0, 1] 범위의 부동소수점 값에 의해 곱해진다. GL의 per-fragment stage는 A value가 framebuffer에 이미 존재하는 대응되는 pixel로 들어오는 fragment를 blend하기위해 사용하도록 설정되어질 수 있다.

antialiased fragment coverage values가 연산되는 방법의 세부사항들은 일반적으로 명시하기에 어렵다. 그 이유는 high-quality antialiasing이 인지적 문제 뿐만 아니라, framebuffer의 내용이 보여지는 모니터의 특징도 고려해야할지도 모르기 때문이다. 그러한 세부사항은 이 문서의 범위에서 다뤄질 수 없다. 게다가, 어떤 primitive의 fragment에 대해 연산되는 coverage value는 그 fragment에 대응되는 것과 이웃한 많은 grid squares에 대한 primitive의 관계에 의존할지도 모른다, 그냥 그 fragment의 grid square가 아니라. 또 다른 고려사항은 coverage values의 정확한 계산은 연산적으로 비쌀지도 모른다; 결과적으로, 우리는 주어진 GL 구현이 빠르지만 전적으로 정확하지 않은 coverage 연산을 사용하여 실제 coverage values를 근사하도록 한다.

이러한 고려사항에서, 우리는 각 보여지는 pixel이 균일한 강도의 완벽한 square가 되는 prototypical case의 정확한 antialiasing 행동을 명시하는 것을 선택했다. 그 square는 fragment sqaure라고 불리고, lower left corner (x, y)를  가지고 있고, upper right corenr (x + 1, y + 1)을 가지고 있다. 우리는 이 simple box filter가 가장 선호할만한 antialiasing results를 생산하지 않을지도 모른다고 인지하지만, 그것은 간단하고 잘 정의된 모델을 제공한다.

GL 구현은 다음의 조건하에서 antialiasing을 수행할 다른 방법들을 사용할지도 모른다:

  1. 만약 f1과 f2가 두 개의 fragments이고, 어떤 primitive에의해 덮여지는 f1의 부분이 그 primitive에 의해 덮여지는 f2의 대응되는 부분의 subset이라면, f1에 대해 연산되는 coverage는 f2에 대해 연산되는 것과 같거나 더 작아야 한다.
  2. 한 fragment f에 대한 coverage computation은 local 이여야만 한다: 그것은 rasterized되는 primitive의 영역에 대한 f의 관계에 의존할지도 모른다. 그것은 f의 x와 y좌표에 의존하지 않을지도 모른다.
바람직하지만 요구되지 않는 또 다른 특성은:
  1. 한 특정한 primitive를 rasterizing하여 생상된 모든 fragments들에 대한 coverage values의 합은 상수여야한다, window coordinates에서 어떤 rigid motions과 상관없이, 그러한 fragments중 어떠한 것도 window edges를 따라 놓여있지 않는 한.
어떤 구현에서, antialiasing quality의 다양한 정도들은 GL에게 hints를 제공하여 얻어질지도 모른다. 그리고 이것은 한 사용자가 image quality vs speed trade off를 하도록 하게 한다.

3.3.1 Multisampling
Multisampling은 모든 GL primitives를 antialias하는 메커니즘이다: points, lines, and polygons. 그 기법은 각 픽셀에 대해 모든 primitives를 여러 번 샘플링하는 것이다. 그 














댓글 없음:

댓글 쓰기