z 'real-time rendering' 태그의 글 목록 :: C++, 그래픽 기술 블로그

역사적으로 그래픽 가속화는 삼각형 내의 픽셀에 대해 보간을 통해 값을 구하고, 표면에 이미지를 입히면서 시작하였습니다. 이러한 계산이 속도에 영향을 미치기에 이에 병렬화로 계산에 특화된 하드웨어를 만들어 그 결과가 GPU 입니다. 시간에 지남에 따라 유연성과 프로그래밍될 수 있게 되었습니다.

3.1. Data-Parallel Architectures


정지(stall)를 피하기 위해서 다양한 프로세서 구조가 사용되었습니다. CPU는 다양한 데이터 구조와 코드를 조작하기 위해 최적화 되었습니다. 이를 위해, 로컬 캐시로 CPU가 구성되어 있고, 다양한 기법을 이용하여 cache miss를 피하고자 합니다.

하지만 GPU에서는 다른 방법을 사용합니다. GPU는 shader core라 불리는 다수의 프로세서로 비슷한 데이터에 대해 한번에 작업을 수행합니다. 이들은 픽셀과 같이 인접하지만 공유 메모리 없이 독립적으로 수행될 수 있기에 가능한 작업입니다. 그렇지 않다면 다른 작업을 기다리는 상황이 발생할 수 있기 때문입니다.

GPU는 처리량에 최적화되어 있는데, 빠른 작업은 많은 자원을 소모합니다. 한정된 캐시 메모리와 제어 로직으로 각각의 shader core는 CPU 프로세서가 만나는 것보다 지연이 큽니다. 따라서 로컬 레지스터에 대해서 조금의 저장 공간을 할당하고, 텍스쳐를 가져오는 것과 같은 작업을 수행하고 기다릴 떄는, 빠르게 그 다음 작업으로 전환하여 수행할 수 있도록 합니다. 즉, 한 프로세서에서 많은 작업을 맡아, 한 작업에서 오래 기다려야하는 부분이 있다면, 이를 기다리지 않고 빠르게 다음 작업으로 넘어가 지연 시간 동안 다른 작업을 수행하여 지연 시간이 실제적으로는 없는 것과 동일하게 수행하도록 합니다. 작업 전환이 자주 일어나 지연이 조금 일어날 수 있지만, 이는 SIMD에 의해 같은 작업을 인접한 데이터에 대해서 수행할 수 있으므로, 데이터를 수행하고 전환할 때의 오버헤드가 적습니다.

GPU에서의 스레드는 입력값을 포함한 작은 메모리로 구성된 하나의 작업을 의미하며, 이들이 모여 warps 혹은 wavefront를 구성하게 됩니다. 이들은 GPU shader core에서 작업을 수행하게 되는데, 이들은 SIMD 혹은 SIMT에 의해 작업이 수행됩니다.

shader 프로그램의 자료 구조는 효율성에 영향을 줍니다. 각 스레드가 필요로 하는 메모리가 커질 수록 GPU에 할당되는 warp수가 줄어듭니다. warp의 수가 적다는 것은 swapping으로 수행되는 작업의 수가 적다는 것이고, 정지 상태에 걸릴 수도 있게 됩니다. 사용 가능한 warp를 occupancy라고 하는데, occpancy가 높다는 것은 사용 가능한 warp가 많아 좋은 퍼포먼스를 낼 수 있다는 뜻입니다. 메모리 패치의 빈번도는 지연이 얼만큼 숨겨지는 지에 영향을 줍니다.

if문과 루프를 통한 동적인 분기점도 효율성에 영향을 주는데, if문을 만나면 모든 스레드들이 평가되고 같은 작업을 해야하기에 같은 분기점에 모여야 하여 때문에 효율이 떨어집니다.

3.2. GPU Pipeline Overview


GPU는 개념적 geometry processing, rasterization, 그리고 pixel processing pipeline을 지원합니다. 파이프라인에서 고정된 함수들도 존재하는 반면, 프로그래밍 가능한 부분도 존재합니다. 논리적 파이프라인의 구체화인 물리적 모델이 하드웨어에 종속되어 있고, 다른 파이프라인에 대해서도 이해함으로서 더 좋은 프로그래밍을 할 수 있게 될 것입니다.

vertex shader와 geometry shader의 경우는 프로그래밍 가능한 작업입니다. tesselation과 geometry shader는 선택할 수 있는 부분이며, 모든 GPU가 지원하지는 않습니다. clipping, triangle setup, triangle traversal 단계는 고정된 함수 하드웨어에 의해 수행됩니다. pixel shader 단계는 프로그래밍 가능하며, merger stage는 프로그래밍은 불가능 하지만, 유연성이 높으며 다양한 작업을 설정할 수 있습니다.

3.3. The Programmable Shader Stage


현대 shader 프로그램들은 통일된 shader 디자인을 사용합니다. 이는 vertex, pixel, geometry 및 tesselation 관련 shader와 같은 것이 공통된 프로그래밍 모델을 공유합니다. 이들은 동일한 ISA(instruction set architecture)을 가지며, common-shader core를 포함하여, shader 프로세서가 다양하게 쓰일 수 있고 GPU가 이에 맞춰 사용되도록 만들었습니다. 즉, 통일된 shader core에서는 병목 현상이 일어나지 않도록 적절하게 작업을 분배합니다. 여기에 HLSL, GLSL 등이 사용되며, 기본적으로 32비트 floating point scalar 및 벡터를 사용하여 색, 위치 등 다양한 정보를 담습니다.

draw call은 그래픽 API가 프리미티브들을 그릴 때 사용하는 것으로, 그래픽 파이프라인과 shader을 작동시킵니다. 쉐이더는 두 가지 종류의 입력을 받는데 uniform은 일정한 데이터를 제공하고, varying은 픽셀마다 다른 데이터를 제공합니다.

기저의 가상 머신이 다른 두 타입의 입력과 출력을 처리하게 해줍니다. uniform을 위한 constant register의 수가 보통 varying을 위한 레지스터보다 더 많습니다. 이는 varying 입출력은 각각의 정점이나 픽셀에 대해 따로 저장되어 공급 값의 한계가 존재하기 떄문입니다. 하지만 uniform은 한번 저장되고 모든 픽셀과 정점에 대해서 다시 사용됩니다.

연산은 대부분 *, +의 기본 연산으로 수행되며, 내재된 sqrt, atan과 같은 함수도 존재하여 최적화되어 있습니다.

if와 case를 통한 흐름 제어도 존재하는데, 두가지 종류가 존재하여, 정적 흐름 제어는 uniform 입력에 의해 분기가 생기는 것으로 다양한 상황의 값을 하나의 쉐이더에서 수행할 수 있도록 하며, 스레드 분기가 생기지 않아 같은 코드 흐름을 지니게 됩니다. 동적 흐름 제어의 경우는 varying 입력에 의해 생기며 이는 Fragment마다 코드가 다르게 동작하여 더 강력하지만, 더 많은 자원을 소모하게 됩니다.

3.4. The Evolution of Programmable Shading and APIs


유구한 역사와 전통을 자랑합니다. 시간되면 읽어보겠습니다. 아마 안 읽을 듯…

3.5. The Vertex Shader


vertex shader는 기능적 파이프라인의 첫 번째 단계입니다. 삼각형은 정점의 집합으로 표현되며, 이는 각각 모델 표면의 특정한 점을 가리키며, 위치, 색과 같은 특성을 포함하고 있습니다. vertex shader는 삼각형을 다루는 첫번째 단계로, 정점만을 다룹니다. vertex shader는 삼각형의 각 정점의 데이터를 다루어 다양한 모델 좌표를 동일한 카메라 좌표로 옮겨지도록 합니다. vertex shader는 unified shader와 유사한데, vertex shader를 통과하는 정점은 독립적으로 작업이 수행되며 값은 변경되지만, 생성, 파괴되거나 다른 정점으로 치환되지 않습니다. vertex shader를 통과한 결과들은 바로 pixel fragment로 갈 수도 있지만, tesselation이나 geomtery shader를 거치거나, 데이터로서 저장될 수도 있습니다.

3.6. The Tessellation Stage


tesselation 단계를 쓰는 이점은, 본래의 모델보다 좀 더 세심하거나 단순하게 표현할 필요가 있을 때 삼각형을 조절할 수 있으며, CPU와 GPU 사이의 데이터 전송할 것이 많아 병목 현상이 생기는 경우, 추가적인 데이터를 GPU에서 생성이 가능하는 등 다양하게 존재합니다.

tesselation 단계는 3가지 구성요소로 이루어지는데, hull shader(tesselation control shader), tesselator, domain shader(tesselation control shader)로 구성됩니다.

hull shader의 입력 값은 특별한 조각 프리미티브로 부분 표면을 저으이하기 위한 여러개의 제어 포인트로 구성되어 있습니다. hull shader는 두개의 기능을 지니는데, 첫번째는 Tesselator에게 얼마나 많은 삼각형이 만들어져야 하며, 어떤 설정이어야 하는지를 얘기하며, 제어 포인트에 대해서 작업을 수행하는 것입니다. 또한, 제어 포

인트를 변경 및 생성, 삭제할 수 있습니다.

 

tesselator는 파이프라인에서 고정된 함수로, domain shader에서 작업을 수행할 새로운 정점을 만들어 냅니다. hull shader가 tesselator에게 어떤 정점을 Domain shader에게 추가해줄 지를 얘기해줍니다. 또한 tesselation factor도 보내주는데, 이는 내부 모서리와 외부 모서리가 존재하여, 내부에서 얼마나 삼각형이 만들어지며, 외부에 얼마나 edge가 나뉘어질 지를 결정합니다.

domain shader는 tesselator에서 받은 입력 정점과 이에 해당하는 출력 정점을 생성하는 것이 vertex shader와 같은 데이터 흐름 패턴을 지닙니다. 이를 통해 삼각형이 구성되고 파이프라인을 따라 흘러갑니다.

3.7. The Geometry Shader


geometry shader는 tesselation 단계에서는 할 수 없는 작업인 프리미티브를 다른 프리미티브로 바꾸는 작업을 수행합니다. 예를 들어 삼각형이 와이퍼 프레임 형태가 되도록 만들 수 있습니다. geometry shader의 입력 값은 하나의 물체와 이와 관련된 정점으로, 물체는 삼각형으로 이루어져, 여기서 확장된 프리미티브가 geometry shader에서 정의 가능해집니다. 해당 단계에서는 정점을 더 추가하여 새로운 정점 편집하거나, 새로운 프리미티브를 만들 수 있게 됩니다.

geometry shader는 입력값을 변경하거나, 복사본을 만들 수 있어, 큐브 맵의 모든 면을 한번에 다 보여주는 것도 가능합니다. geometry는 입력한 primitives 순서대로 나오는 것을 보장하는데, 이는 성능에 영향을 줄 수 있습니다.

3.7.1 Stream Output

GPU 파이프라인의 표준 사용은 vertex shader를 통과한 삼각형이 rasterize되어 pixel shader로 넘어가는 것입니다. 이 도중의 값들은 접근할 수 없었습니다. stream output이라는 개념은 vertex shader를 지난 정점에 대해서 stream으로 출력하면서 rasterization 단계로 넘기지 않아도 무관합니다. 이런 식으로 진행되는 데이터는 파이프라인에서 돌아와 반복적인 작업을 수행하도록 합니다. stream output은 오직 float만을 리턴하는데, 이는 비용이 꽤 듭니다. stream output은 정점이 아닌 primitive에 대해 작업을 수행하는데, 각각의 삼각형은 3개의 정점의 집합을 출력하게 되며, 원래 mesh에서 공유되던 정점은 값을 잃게 됩니다.

3.8. The Pixel Shader


vertex, tesselation 그리고 geometry shader의 작업이 끝나고, primitive는 clipping되어 rasterization을 수행하게 됩니다. 이번 장에서는 비교적 고정되어 있는 단계로, 수정은 가능하지만 프로그래밍은 불가합니다. 각 삼각형은 어떤 픽셀을 덮는지 순회하며 확인하게 되고, 이러한 픽셀을 fragment라고 합니다. 이때의 값들은 정점에서 보간된 값을 가지게 되며, 이들은 pixel shader로 전송 되어집니다.

pixel shader는 이렇게 받은 값들을 계산하고 fragment 색을 도출해냅니다. 이는 불투명한 색을 내거나, z-depth 버퍼를 조절할 수도 있으며, 이러한 값들을 통해 pixel에 저장된 값을 변경합니다. stencil buffer는 변경될 수 없지만, merge 단계에서 통과될 수 있습니다.

pixel shader는 또한 fragment 값을 받고 아무런 출력도 하지 않을 수 있는데, 이는 mesh의 부분만을 나타내게 만들 수도 있습니다.

MRT(multi render targets)의 등장으로 pixel shader는 단순히 merging 단계만을 수행하던 것이 다양한 작업을 수행할 수 있도록 변경되었는데, 색과 z-buffer에 pixel shader 프로그램의 결과값을 보내는 것 대신에, 값들의 집합이 다른 버퍼나 fragment에 생성되도록 합니다. 이를 render target이라고 하는데, 이러한 구조는 depth, data format을 똑같이 가져가면서, GPU에 따라 여러개를 지닐 수도 있습니다. 이는 다양하게 사용될 수 있는데, deferred shading 혹은 나온 결과 값에 다양한 변화를 주어 다양한 렌더링 알고리즘을 수행할 수 있습니다.

pixel shader의 한계는 주어진 fragment 위치에 대해서만 render target을 적을 수 있고 주변에는 영향을 끼치지 못한다는 점입니다. 하지만 이는 다른 기술을 사용하면 해결할 수 있으며 이는 12장에서 소개됩니다. 또한 이에는 예외 사항이 있는데, 미분 혹은 gradient를 적용할 때 주변의 정보에 접근할 수 있다는 것입니다. pixel shader는 x와 y축을 따라서 보간 값들이 주어지는데, 이들은 다양한 계산과 텍스쳐링에 사용됩니다. 이때 pixel shader에서 2 x 2형태의 fragment 집합인 quad를 요청하면, 이에 현재 픽셀의 값과의 차이를 받아 올 수 있는데, 이를 통해 gradient 계산을 수행할 수 있습니다.

3.9. The Merging Stage


merging 단계는 각 fragment의 깊이와 색을 framebuffer와 혼합하는 단계입니다. 전통적인 파이프라인에서는 이는 stencil-buffer와 z-buffer 연산으로 수행되었습니다. 깊이를 통해 그릴 지 여부를 확인하고, 투명하다면 blending을 수행합니다.

z-buffer에 의해서 fragment가 그려질 지 정해지기 때문에, depth-testing을 통해 먼저 계산 여부를 판단하며 이를 early-z라고 합니다.

Merging 단계는 직접 프로그래밍이 가능하지는 않지만, 설정 가능하여 많은 작업이 수행가능 합니다. Blending이 그 예시이며, 색에 대해 다양한 연산이 가능합니다.

3.10. The Compute Shader


GPU는 전통적인 그래픽 파이프라인만이 아니라 여러 계산을 위해서도 사용 가능합니다. 이러한 방법을 GPU computing이라고 하며, CUDA 및 OpenCL에서는 이를 거대한 병렬 프로세서로서 제어합니다.

이러한 compute shader의 장점은 GPU에서 생성된 데이터에 접근할 수 있다는 점입니다. CPU에서 보내는 것은 지연을 발생시키기에, 이는 결과물을 계속 GPU 메모리에 둠으로서 효율을 극대화 시킬 수 있습니다. 이는 Post-processing에 사용될 수 있습니다.

또한 파티클 시스템이나, culling, shadowing 등 연산을 많이 필요로 하는 작업에 사용 가능합니다.

'그래픽 공부 > Realtime Rendering' 카테고리의 다른 글

Chapter 5. Shading Basics  (0) 2022.07.26
2. The Graphics Rendering Pipeline  (0) 2022.07.11
21. Virtual and Augmented Reality  (0) 2022.05.11
8. Light and Color  (0) 2022.05.11

Chapter 2. The Graphics Rendering Pipeline

간단한게 파이프라인이라고도 불리며, 주요 기능으로는 점을 생성하고 주어진 가상의 카메라로 3차원의 물체나 광원 등을 촬영해 2차원 이미지로 렌더링하는 역할을 맡습니다. 이미지 안에서 위치와 모양은 그들의 기하학, 환경적 특성, 카메라가 위치한 장소에의해 결정되며, 모습은 마테리얼 속성이나, 광원, 텍스처, 셰이더등의 영향을 받습니다.

2.1 Architecture


파이프라인은 여러 단계로 이루어지며 각각은 큰 업무의 부분 부분을 구성합니다. 파이프라인 단계는 병렬적으로 수행되며, 파이프라인은 여러 개의 단계로 이루어져 있어 앞단계의 결과에 의존하게 됩니다. 이러한 파이프라인의 형태를 사용하는 이유는 비 파이프라인인 시스템을 n개의 파이프라인 단계를 나누게 되면 이를 병렬적으로 수행하여 그에 비례한 속도의 향상을 기대할 수 있게 됩니다. 특정한 곳에서 시간 지체가 되는 경우를 병목 지역(bottleneck)이라 하는데, 이는 전체 작업의 시간을 결정하게 됩니다. 밑의 그림과 같이 렌더링의 파이프라인은 4단계 구조를 지니게 됩니다. 이는 기능적으로 나눈 것이고 실제 구현은 걸리는 시간에 따라 단계를 더 나누거나 병합하게 됩니다.

2.2 Application


Application 단계는 통상의 CPU에서 일어나는 작업을 수행합니다. 이러한 CPU는 병렬적으로 멀티 스레딩을 수행할 수 있으며, 충돌 검출, 전역적 가속 알고리즘 등 여러 일을 수행하며 해당 단계에서 발생하는 모든 일은 개발자가 직접 제어할 수 있기에, 구현에 따라 해당 단계 및 이후의 단계의 성능에 영향을 미칠 수 있습니다. 예로 Application 단계에서 그릴 삼각형 수를 감소시킨다면 이전에 비해 후속 단계들은 훨씬 빠른 결과를 나타낼 수 있습니다.

기본적으로 Application 단계는 CPU에서 동작하지만 GPU로 작업을 처리할 수도 있는데 이를 Compute Shader라 부릅니다. 이는 GPU의 높은 병렬 처리 능력이 높아 효율적으로 계산을 할 수 있습니다. 해당 단계에서 가장 중요한 일 중 하나는 다음단계인 Geometry Processing을 하기 위한 rendering primitive(points, lines, and triangles) 정보를 전달해주는 것입니다.

Application 단계의 소프트웨어 기반 구현의 결과는 하위 단계로 나누어져 있지 않지만 성능을 위해 여러개의 프로세서 코어에서 병렬적으로 호출할 수 있도록 할 수 있습니다다. 어플리케이션 단계는 다른 파이프라인 단계에서 구현하기 힘든 충돌 감지, 부분적 컬링, 가속 알고리즘의 적용과 같은 부분은 해당 단계에서 진행합니다.

2.3 Geomtery Processing


Geometry Processing은 회전, 투영과 같은 기하학적 조작을 수행하며, 대부분의 삼각형 당 그리고 점 당 작업을 책임집니다. 이는 통상적으로 GPU에서 수행됩니다. 이는 기능적 면에서 다음과 같이 4가지 단계로 나뉘어 집니다.

2.3.1 Vertex Shading

해당 단계의 가장 중요한 2가지 역할은 점의 위치를 계산하고, 필요시 되는 법선 벡터나 텍스터 좌표와 같은 정점 데이터를 전달합니다. 전통적으로 물체에 대한 그림자를 계산할 때 이 단계에서 진행하여 해당 프로그래밍 가능한 계산 유닛을 Vertex Shader라고 부른다. 이는 GPU의 발전에 따라 픽셀 당 계산을 진행하게 되어 이름만 남게 되었습니다. 현재는 각 정점에 대한 데이터를 설정하는 일반적인 유닛이 되었습니다.

좌표의 집합이 요구되는 정점 위치가 어떻게 계산되는지에 대해 알아보겠습니다. 화면에 모델은 공간과 좌표 시스템에 따라 변환을 하게 되는데, 각각의 모델을 자신만의 모델 좌표계를 가지고 model transform을 통해 모델 좌표계를 월드 좌표계으로 변환합니다. 따라서 하나의 모델로도 여러 개의 모델을 월드 좌표계에 존재하도록 만들 수 있습니다. 이렇게 월드 좌표계에 존재하는 물체들을 카메라에 담도록 하여야 하는데, 이는 카메라를 중심으로 좌표계를 다시 구성한 카메라 좌표계로 변환 는 view transform을 통해 수행됩니다. 카메라를 중심으로 -z축은 카메라 방향, y축은 위, x축은 오른쪽을 가리키며, API에 따라 view transform은 상이합니다. 이러한 변환을 통해, 카메라를 중심으로 보이는 물체와 보이지 않는 물체를 명확하고 효율 좋게 잡아낼 수 있기 때문입니다. 이러한 과정을 view transform 이라고 부른다. 이 view tranform이 일어날때 투영(Projection), 절단(Clipping)과정이 포함됩니다.

지금까지는 역할 중 첫번째 작업인 정점 위치 계산을 알아봤다면, 두번째는 사실적인 그림을 위해 위치 및 형태만이 아닌 모습을 모델링 하기 위한 재료와 빛에 대한 정보를 제공해야 합니다. Shading으로 알려진 이러한 작업은 재료가 빛에 대해서 어떤 효과를 보이는 지를 결정하게 됩니다. 보통, 이들은 geometry processing 중 모델의 정점에 대해 계산할 때 수행되는데, 정점에는 위치, 법선 벡터, 색깔과 같은 shading 방정식에 필요한 다양한 정보를 저장할 수 있으며, 이러한 결과가 rasterization 및 pixel processing에서 보간되고 표면에 색을 표현하게 됩니다.

Vertex shading의 부분으로, 투영(Projection)을 수행하는데, 이는 점들을 (-1, -1, -1)과 (1, 1, 1)을 기준으로 하는 canonical view volume이라 불리는 유닛 큐브에 변환시키는 작업입니다. 이는 크게 두가지 방법이 존재하는데, 정사영(orthographic)과 투시법(perspective)이 존재합니다. 정사영은 빛을 평행하게 보내어 건축학에서 자주 쓰이는 방법이며, 관측 형태가 사각형의 형태를 띄어 평행인 부분은 변환시키더라도 평행하게 보입니다. 투시법은 카메라와 같이 실제 보이는 것과 같이 보여주는 기법으로, 조금 더 복잡합니다. 이는 frustrum이라고 하는 잘린 피라미드 형태의 모습의 관측 형태를 띄며, 이를 다시 유닛 큐브 형태로 변환을 시켜야만 합니다.

그 이후, 변환을 거친 좌표들에 대해서 z좌표는 2D 이미지 이므로 depth-buffer에 담겨 물체가 보이는 지의 여부 판단을 하게 되며, x, y좌표는 이미지의 위치에 해당하게 됩니다.

2.3.2 Optional Vertex Processing

모든 파이프라인이 방금 설명된 단계를 거치지만, 그 이후에 선택할 수 있는 몇몇개의 단계가 더 존재합니다. 이들은 서로 독립적이며 잘 사용되지 않을 수도 있습니다.

  • Tessellation Stage
  • 모델이 위치하고 있는 거리나 공간에 따라 삼각형을 더 생성하거나 다른 형태로 바꾸어 세부적인 모델링 수준을 설정할 수 있는 스테이지입니다. hull shader, tessellator, domain shader로 구성됩니다.
  • Geometry Shader
  • 다양한 렌더링 프리미티브들을 정렬하고 새로운 점을 추가할 수 있는 단계로 가장 유명한 것으로 파티클 생성이 있습니다. 하나의 정점으로 표현되는 입자에 다양한 효과를 줄 수 있습니다.
  • stream output 이 단계는 GPU를 geometry engine으로 사용할 수 있게 하여, 작업한 정점들을 다음의 단계로 보내는 것이 아니라, CPU에서 사용할 수 있게 하여 이를 통해 파티클 시뮬레이션을 수행할 수 있습니다.

2.3.3 Clipping

좌표계 변환과 투영을 통해 나온 결과들 중, 유닛 큐브 안에 있는 렌더링 프리미티브들만을 취급하도록 나머지 부분을 자르는 역할을 합니다. 이 중, 일부 부분만 안에 있다면, 유닛 큐브 안에 있는 부분만 다룰 수 있도록 밖의 부분을 잘라내고, 안에 새로운 정점들을 만들어 냅니다. 또한 유저가 sectioning을 통해 추가적으로 물체를 골라낼 수도 있습니다.

2.3.4 Screen Mapping

Clipping 단계를 걸쳐 유닛 큐브 안에 있는 물체들이 실제 화면으로 보내지는 단계로, 3차원의 좌표를 가지던 것을 x, y좌표만 취하여 화면 좌표계로 바꾸고, 이를 실제 사용하는 화면에 맞게 변환을 수행합니다. 이때 z좌표는 API에 따라 OpenGL의 경우 범위가 [-1, 1]인 반면 DirectX는 [0, 1]로 이들 모두 rasterization 단계로 보내집니다. 또한 (0, 0)의 시작 위치도 OpenGL은 왼쪽 하단인 반면 DirectX는 왼쪽 상단인 경우도 존재하기에 이에 주의를 해야합니다.

2.4 Rasterization


Rasterization 단계는 geometry processing에서 프리미티브를 이루는 계산된 정점과 그에 관한 데이터들을 영역 내의 픽셀들을 검출하여 이에 대한 정보를 다음 단계로 넘기는 역할을 합니다. 이러한 작업 자체를 rasterization이라고 하며 크게 아래와 같은 두가지 단계로 나누어 집니다.

이 단계에서 중요한 것은 z-buffer를 통해 어떤 그림이 그려질 지를 검출하는 것과, 특정 픽셀이 보통 삼각형 안에 들어가는 지를 확인하는 여부입니다. 여기에는 멀티 샘플링이 사용될 수도 있습니다.

2.4.1 Triangle Setup

데이터로 부터 삼각화를 진행하는 단계로 triangle traversal에 쓰일 데이터를 얻습니다.

2.4.2 Triangle Traversal

각각의 픽셀이 삼각형에 의해 덮혀있는지를 확인하는 단계로 자세한 사항은 5장에서 다뤄질 것입니다. 삼각형 안에 있는지 찾아내는 방법을 triangle traversal이라 부르며, 각각은 삼각형의 데이터에 의해서 보간이 됩니다. 이는 geometry stage에서 받아온 많은 데이터들을 보간에 의해 수행합니다.

2.5 Pixel Processing


마지막 단계로서, rasterization 단계에서 수행한 결과인 픽셀에 대하여 색, 깊이 테스트를 통해 어떻게 보이는 지를 결정하며, blending도 수행 가능합니다. 이는 pixel shading과 merging, 두 단계로 나누어지며, Pixel processing은 픽셀 당 혹은, 샘플 당 계산 및 작업이 수행됩니다.

2.5.1 Pixel Shading

 Shader를 통해 픽셀 당 표현될 색을 계산하는 단계로 프로그래머가 모두 프로그래밍이 가능한 단계이다. DirectX는 Pixel Shader라 부르고 OpenGL 은 fragment shader라 부른다. 여기서 수행되는 중요한 작업으로는 텍스쳐를 입히는 texturing이 있으며, 이는 2, 3차원으로 구성될 수 있습니다.

2.5.2 Merging

 각 픽셀에 대한 정보를 color buffer에 저장하는데, merging stage는 기존의 값과 새로 들어오는 픽셀을 섞는 책임을 가지고 있는 단계입니다. 이를 ROP(render output unit, or, raster operation pipeline)이라 부르는데, 이는 유연하며 다양한 효과를 연출할 수 있습니다.

이 단계는 시각적 효과를 담당하며, 이는 color buffer에 화면에 전송할 모든 색상의 값을 담고 있어야 하는데, 이에 대한 깊이도 z-buffer에 담고 있습니다. 이를 통해 가장 가까운 물체를 확인하게 되는데, 가장 가까운 물체인 z-buffer가 최소인 값에 대해서 표현을 하게 됩니다. 하지만 단순히 z-buffer 비교를 통해 렌더링한다면 색을 blending하는 것은 불가능 해집니다. 따라서 alpha 채널을 통해 각 픽셀에 대한 투명도를 책정하여 color buffer에 색을 담게 됩니다.

 stencil buffer는 위치에 따라 렌더링할지 말지를 선택하는 버퍼로 보통 픽셀당 8비트로 구현되어 있습니다. 이를 통해 원 모양의 형태으로 렌더링하는 것이 가능해집니다.

 framebuffer는 위에서 언급된 모든 buffer들의 집합체에 해당하며, 실제 컴퓨터나 API에서는 double buffering을 통해 화면을 빠르게 swapping하여 보여주는 것으로, 미완성 화면을 보내는 불상사를 막습니다.

'그래픽 공부 > Realtime Rendering' 카테고리의 다른 글

Chapter 5. Shading Basics  (0) 2022.07.26
3. The Graphics Processing Unit  (0) 2022.07.12
21. Virtual and Augmented Reality  (0) 2022.05.11
8. Light and Color  (0) 2022.05.11

가상현실(VR)과 증강현실(AR)은 실제 세계처럼 감각을 자극하는 기술로, 증강현실은 인조물을 실제 세상과 통합하려 하고, 가상현실은 세상을 완전히 대체하려 합니다. 이 장에서는 이 두 가지 기술에 특화된 렌더링 기술에 초점을 맞추고 있으며, XR이라는 포괄적 용어를 사용하여 함께 기술할 수도 있습니다.

21.1. Equipment and Systems Overview


그래픽용 가상 및 증강현실 장비는 CPU와 GPU를 제외하고 센서 또는 디스플레이로 분류할 수 있습니다. 센서에는 무수히 다양한 입력 방법과 장치로 사용자의 회전 및 위치를 감지하는 추적기가 포함됩니다. 디스플레이의 경우는 논리적으로 화면을 두개로 나눌 수 있다면, 휴대폰을 사용할 수도 있고, 전용 시스템을 사용하여 가상 현실을 보여줄 수 있습니다. 증강 현실의 경우, 가상은 특별히 설계된 광학 장치를 사용하여 실제 세계의 장면과 결합됩니다.

휴대폰은 직접적으로도, 기어VR과 같은 헤드 마운트 디스플레이로도 사용이 가능하며, 이는 휴대폰 내의 중력, 자력 및 다른 여러 메커니즘을 통해 디스플레이의 방향을 정할 수 있습니다. 고정 뷰 파노라마 및 비디오와 같은 실제 세계를 담은 콘텐츠는 사용자의 방향에 대한 정확한 2차원 장면을 보여주는 비용이 상당히 낮기 때문에 휴대폰을 이용한 장치들과 잘 작동할 수 있습니다. 하지만 휴대폰을 이용한 경우는 하드웨어 사양 및 전력 요구량 측면에서 좋지 않습니다. 따라서, 이동성이 제한되지만 직접 컴퓨터에 연결하여 사용하는 오큘러스와 같은 장치도 존재합니다. 또한 핸드 컨트롤러는 표준 장비로 마우스나 키보드와 달리 추적 가능하고 사용자와 함께 이동할 수 있으며 다양한 기술을 기반으로 VR을 위해 다른 많은 유형의 입력 장치가 개발되었습니다.

증강현실은 사용자의 실제 세계관과 결합된 컴퓨터 생성 콘텐츠로 정의됩니다. 텍스트 데이터가 이미지에 중첩된 헤드업 디스플레이(HUD)를 제공하는 모든 애플리케이션은 증강 현실의 기본 형태입니다. 혼합 현실(MR)은 실제와 3차원 가상 콘텐츠가 실시간으로 혼합되고 상호 작용하는 증강 현실의 하위 집합입니다.

21.2. Physical Elements



이 섹션은 현대 VR 및 AR 시스템의 다양한 구성 요소와 특징, 특히 이미지 디스플레이와 관련된 요소에 대해 설명합니다.

21.2.1 Latency

대기 시간의 영향을 완화하는 것은 VR 및 AR 시스템에서 특히 중요합니다. 여기서 의미하는 것은 움직임에서 이에 대한 화면이 생성되기까지의 대기 시간을 의미합니다. 일반적인 경우의 지연은 거슬리는 정도이지만 XR의 경우는 짧으면 픽셀 고정이 일어나고, 길면 더 이상한 연출을 하게 될 것입니다. 행동과 화면 과의 지연이 20ms 쯤부터 지각이 가능하다고 합니다. 이를 방지하는 방법은 다양하게 존재합니다. 움직임을 제한하게 사물을 배치하여 시각적 변화를 최소화하거나 음악 재생을 통한 심리적 접근도 존재합니다.

트래킹 포즈는 보통 머리 위치를 가리키는 말로, 렌더링에 필요한 카메라 매트릭스를 형성하기 위해 사용됩니다. 프레임의 시작부터 포즈에 대한 대략적인 예측을 통해 요소들과의 충돌 감지와 같은 시뮬레이션을 수행할 수 있습니다. 렌더링이 시작되려고 할 때, 새로운 포즈 예측을 통해 장면을 업데이트할 수 있으며, 이미지가 표시되려고 할 때 보다 정확한 다른 포즈 예측을 통해 사용자의 위치에 더 잘 맞게 이미지를 만드는데에 사용할 수 있습니다. 각각의 이후의 예측은 이전의 부정확한 예측을 기반으로 한 계산을 완전히 메꿀수는 없지만 전체적으로 더 향상될 여지를 보이게 됩니다.

21.2.2 Optics

가상현실 디스플레이 시스템이 망막에 바로 이미지를 매핑하는 것은 상당히 비용이 많이 들기에, GPU가 생산한 이미지가 후공정을 통해 눈으로 들어오게 하기에 적당한 비용으로 사용가능합니다. VR 시스템의 렌즈는 이미지의 가장자리가 안쪽으로 휘어지는 것처럼 보이는 핀쿠션 왜곡이 있는 넓은 시야 이미지를 제공하는데 생성된 각 이미지를 뒤틀어 왜곡을 만들어 이를 상쇄합니다. 광학계도 보통 프리즘처럼 렌즈가 색을 분리시키는 색도의 차이를 겪는데 역으로 색도 차이를 만들어 내는 이미지를 생성하여 해결 가능합니다.

디스플레이에는 롤링과 글로벌, 두 가지 유형이 있습니다. 두 디스플레이 유형 모두 영상이 직렬 스트림으로 전송됩니다. 롤링 디스플레이에서 이미지를 한 줄씩 받자마자 출력을 하고, 글로벌 디스플레이는 전체 이미지를 받으면 한번에 표시합니다. 각각의 서로 다른 장점이 존재하는데, 롤링 디스플레이는 가능한 한 빨리 결과를 표시한다는 점에서 대기 시간을 최소화할 수 있지만 서로 다른 픽셀이 다른 시간에 조명되므로 망막과 디스플레이 사이의 상대적인 움직임에 따라 이미지가 흔들리는 것으로 인식될 수 있습니다. 이러한 불일치는 증강 현실 시스템에 특히 혼란을 줄 수 있습니다. 이는 헤드 포즈를 예측하여 보간할 수 있지만, 속도가 빨라지는 경우는 힘듭니다.

21.2.3 Stereopsis

두 이미지는 각각의 눈으로 보기에 상쇄되는데 이로 인해 깊이를 인식하는 입체시들을 자극합니다. 효과는 존재하지만 입체시는 거리가 멀면 약해지고, 깊이를 인식하는 유일한 방법은 아니다. 모니터를 볼 때는, 전혀 작동하지 않고, 객체 크기나 텍스처 패턴 변화 등의 시각적 정보를 통해 자각합니다. 눈이 물체에 집중하기 위해 얼마나 안쪽으로 향해야 하는가를 베전스 수요라고 하며, 이때 현실 세계에서 눈은 렌즈 모양을 바꾸고 일제히 안쪽으로 향하는데, 이것은 accomodation-convergence 반사라고 합니다. 디스플레이의 경우 accomodation적 수요는 동일하지만, 서로 다른 인식 깊이에 있는 물체에 눈이 집중됨에 따라 convergence적 수요가 변화하기에 불일치가 생겨 눈의 피로를 유발할 수 있으며, 사용자가 실제 세계의 먼 물체에 집중할 수 있지만 눈 근처의 고정된 깊이에 있는 관련 가상 게시판에 다시 초점을 맞춰야 하는 일부 AR 시스템에서 지각 효과를 가져올 수도 있다.

VR과 AR을 위한 스테레오 쌍을 생성하는 규칙은 단일 디스플레이 시스템의 규칙과는 다릅니다. VR에서 각각의 눈은 별도의 디스플레이를 가지고 있는데, 이는 망막에 투영된 이미지가 현실에 가깝게 위치하도록 해야하기 때문입니다. 눈에서 눈까지의 거리를 IPD라고 하는데, VR과 AR 시스템은 사용자의 IPD를 결정하고 조정할 수 있는 보정 방법이 있어 이미지 품질과 편안함을 향상시킵니다. 시스템의 API는 이 IPD를 포함하는 카메라 모델을 제어합니다. 효과를 얻기 위해 사용자의 인식 IPD를 수정하지 않는 것이 가장 좋습니다. 예를 들어, 눈-분리 거리를 늘리면 깊이에 대한 인식이 향상될 수 있지만 눈의 피로감을 유발할 수도 있습니다.

21.3. APIs and Hardware


특별한 이유가 없는 한 시스템 공급자가 제공하는 SDK(VR 소프트웨어 개발 키트) 및 API(애플리케이션 프로그래밍 인터페이스)를 항상 사용하십시오. 자신만의 코드를 통해 구축을 하고자 한다면 광범위한 테스트를 거치지 않고는 이에 대한 성능을 확신할 수 없습니다. 이러한 이유 및 다른 사유로, 애플리케이션 제어 왜곡은 모든 주요 API에서 제거되어, VR 디스플레이를 올바르게 표시하며 성능을 최적화하고 품질을 유지하는 것은 시스템에서 작업합니다.

대부분의 가상 및 증강 현실에서 API에서 공통적으로 사용하는 3차원 장면의 렌더링된 이미지를 헤드셋으로 전송하는 과정은 간단합니다. 먼저, 렌더링되려는 프레임의 시간의 시간을 결정하여 시간 지연을 측정가능하도록 합니다. 이 값은 SDK가 프레임을 보는 순간 눈이 어디에 어느 방향으로 위치할 것인지에 대한 추정치를 계산할 수 있도록 합니다. 이 예상 대기 시간이 주어지면 각 눈의 카메라 설정에 대한 정보나 헤드 방향과 위치 혹은 자세 등의 정보를 API에 보내면 렌더링된 이미지가 보낸 정보에 맞춰 예상 위치와 방향을 고려하여 만들어지며 이를 보여줍니다. 이를 통해 지연 시간의 영향을 최소화할 수 있습니다.

각 눈에 대해 예측된 포즈가 이에 맞게 두개의 장면이 개별적으로 주어지며주어지면 일반적으로 장면을 두 개의 개별 표적으로 렌더링합니다. 이러한 대상은 텍스처로 SDK의 합성기로 보내져 이미지를 헤드셋에서 가장 잘 보이는 형태로 변환합니다. 또한 합성기는 다양한 층들을 함께 합성할 수 있습니다. 각 눈에 대해 영상이 구성되면 왜곡, 색차 및 필요한 기타 프로세스가 SDK에 의해 수행된 후 결과가 표시됩니다.

API를 사용한다면 알고리즘에 대해 전부 이해할 필요는 없지만, 알아두는 것이 나중을 위해 좋습니다. 이미지 합성부터 시작하면, 간단한 방법은 전부 합한 이후에 다양한 이미지 보정을 사용하는 것입니다. 하지만 각 층에 대한 보정을 먼저 적용시킬 수도 있습니다. 이 방법의 장점은 다른 해상도에 대해서 자체적으로 적용되어 이미지 품질이 향상될 수 있다는 점입니다.

사용자가 인식하는 시야는 원형에 가까우므로, 모서리 근처의 픽셀은 렌더링할 필요가 없습니다. 따라서 모서리 근처를 스텐실 버퍼 같은 것으로 막아 렌더링하지 않도록 막아 시간 낭비를 줄일 수 있습니다. 또한 렌더링된 이미지를 화면이 원하는 모양으로 재매핑시켜 왜곡시킬 필요가 있는데, 이는 픽셀 셰이더에서 출력 디스플레이 픽셀에 해당하는 텍스처의 정확한 위치를 계산하여 수행가능하지만 비쌉니다. 삼각형에 대해서는 텍스처를 적용하는 것이 더 효율적인데, 메시가 왜곡되면 색깔 차이가 보정되지 않기에, 텍스처 좌표를 이용하는 것이 더 안정적입니다.

21.3.1 Stereo Rendering

두 개의 화면에 대해 각각 렌더링하면 많은 비용이 듭니다. 이는 같지 않고, 다른 요소들을 포함하기에 단순하게 복사도 불가능하기에 많은 방법들이 연구되었습니다.

Frustrum culling은 종종 GPU의 파이프라인으로 메시가 전송되기 전에 수행되는데, 한쪽에 대해서만 수행하더라도 양쪽 모두에 적용도리 수 있습니다. 이는 렌더링 전에 수행되므로, 사용할 렌더링된 정확한 뷰는 컬링이 발생한 후에 다시 수습될 수 있습니다.하지만 이는 제거된 모델을 다시 수습해서 볼 수도 있기에, culling을 하는 동안 안전 영역을 필요로 합니다.

두개의 장면를 만들 때, 하나의 장면을 완전히 렌더링하고 나서 차례로 나머지 하나를 렌더링할 수 있습니다. 이는 상태 변화도 두 배로 증가한다는 결정적 단점을 가지고 있으며, 타일 기반 렌더러의 경우 보기 및 렌더 대상을 자주 변경하면 성능이 저하됩니다. 더 나은 대안은 카메라 변환을 중간에 전환하면서 각 개체를 두 번 렌더링하는 것이지만 이도 API draw 호출수가 2배인 상태 이빈다. 다른 하나의 방법은 geometry shader를 통해 각 뷰에 삼각형을 보충하는 방법이지만, 이는 처리량의 효율을 낮추기에 사용되지 않습니다. 좀 더 나은 방법으로는 한 번의 드로우 호출에 2번 그려지도록 인스턴스화 하는 방법이 존재합니다. 또 다른 접근법은 한 눈의 이미지를 렌더링할 때 명령 목록을 형성하고 참조된 상수 버퍼를 다른 눈의 변환으로 이동한 다음 이 목록을 재생하여 두 번째 눈의 이미지를 렌더링하는 것입니다. 파이프라인 아래로 지오메트리를 두 번 이상 전송하지 않도록 하는 몇 가지 확장들이 존재하며, 구현에 자유를 줍니다. 2번 렌더링하되 각각의 화면에 맞는 삼각형을 각각 보내기도 합니다.

멀티 GPU는 각각의 화면을 두개의 GPU에서 각각 렌더링하는 방법입니다. affinity mask를 통해 API 호출에 대해 지정된 GPU로 가도록 합니다. 만약 하나의 렌더링 이미지를 필요로 한다면, 한 GPU에서 다른 GPU로 작업 결과를 보내어 합치도록 합니다.

스테레오 시야로 얻는 시차는 가까이있는 경우는 중요하지만 멀리 있는 경우는 무시됩니다. 이 사실을 활용하면 수직 분리 평면을 통하여, 가까운 것은 따로 멀리 있는 것은 한꺼번에 그려 좀 더 효율적으로 그릴 수 있습니다.

광학에 필요한 왜곡으로 인해 각 눈의 이미지 주변에 더 높은 픽셀 밀도가 생성됩니다. 또한 사용자가 화면의 중앙을 상당 시간 바라보기 때문에 주변부의 중요성은 보통 떨어지기에 이에 대해 적은 비용으로 처리하려는 연구가 많았습니다. 주변부 해상도를 낮추기 위해 화면을 3x3 섹션으로 나누어 주변부 주변을 더 낮은 해상도로 렌더링하는 방법이 존재합니다.

21.3.2 Foveated Rendering

눈에 대해서 조금 더 깊게 파고 들면 눈의 망막의 중심의 오목한 곳은 색각과 관련된 광수용체인 원추체가 많이 포함된 곳이기에 우리의 시력은 이 지역에서 가장 높으며, 우리는 비행 중인 새를 추적하거나 페이지의 텍스트를 읽는 것과 같은 이 능력을 활용하기 위해 눈을 회전시킵니다. 시력은 중심에서 멀어질수록 빠른 속도로 떨어지는데, 처음 30도 동안 중심에서 2.5도마다 약 50%씩 떨어지며, 더 가파르게 바깥쪽으로 떨어집니다. 우리의 눈은 두 눈이 같은 물체를 볼 수 있는 양안 시야를 114도 수평으로 가지고 있습니다.

낮은 시력 영역에서 디스플레이의 픽셀이 눈에 많이 보이기에 이를 통해 작업량을 줄일련느 것이 foveated rendering입니다. 이는 눈이 가리키는 부분을 다른 모든 것에 적은 노력을 들이지 않고 높은 해상도와 품질로 렌더링하는 것입니다. 문제는 눈이 빠르게 움직이면 렌더링할 영역이 바뀐다는 것인데 이를 눈 추적 하드웨어를 통해 해결하려고 하지만 아직은 어렵습니다. 또한 주변부에서 "더 큰" 픽셀을 렌더링하면 앨리어싱 문제가 증가하는 경향이 있습니다. 해상도가 낮은 주변 영역의 렌더링은 대비를 유지하려고 시도하고 시간이 지남에 따라 큰 변화를 피함으로써 잠재적으로 개선될 수 있으며, 그러한 영역을 보다 지각적으로 수용할 수 있게 합니다.

21.4. Rendering Techniques


하나의 화면에 작용하는 것이 두 개에도 반드시 작용하는 건 아닙니다. 스테레오 내에서도 시청자와 함께 움직이는 화면과 비교해 고정된 단일 화면에서 작동하는 기술에는 상당한 차이가 존재합니다. 따라서 단일 화면에서의 알고리즘이 AR, VR에서 문제가 발생하는 경우에 대해서 언급을 하도록 하겠습니다.

범프 매핑은 평평한 표면에 그림자를 색칠하기에, 먼 물체에는 잘 작동하지만, 큰 기하학적 물체에 대해서는 착시 현상이 빠르게 깨지게 됩니다. 또한 스카이 박스는 무한에 가까운 곳에서 렌더링되도록 크기가 조정되어, 눈 위치의 차이가 렌더링에 영향을 미치지 말아야 합니다. 톤 매핑의 경우는 눈에 무리가 가지 않도록 렌더링된 이미지가 서로 같아야 합니다. SSAO와 반사는 잘못된 스테레오 차이를 만들게 할 수도 있으며, 이는 z-depth를 이용하는 bloom이나 flare에서도 일어날 수 있습니다. 물과 열에 의한 왜곡도 재작업이 필요합니다. 또한 광택 위치가 서로 다를 수 있는데, 이러한 차이가 비인지적으로 만들 수 있다고 합니다. 모션 블러 효과는 눈의 움직임으로 인해 발생하는 아티팩트를 넘어 이미지를 흐리게 하므로 사용하면 안 됩니다. AR은 실제 환경에 존재하는 것과 유사한 조명을 가상 객체에 적용하는 것과 같은 추가적인 과제가 발생합니다. 일부 상황에서는 실제 조명을 미리 제어하고 가상 조명으로 변환할 수 있지만 가능하지 않다면 다양한 조명 추정 기법을 사용하여 환경의 조명 조건을 즉시 캡처하고 근사할 수 있습니다.

21.4.1 Judder

완벽한 추적과 가상 세계와 실제 세계 간의 통신이 적절히 유지되더라도 지연 시간은 여전히 문제입니다. 영상이 합성기로 전송되고 표시될 때까지 생성되지 않으면 프레임이 손실됩니다. 프레임이 떨어지면 화면을 따라 눈이 이동할 때 가장 잘 보이는 VR 헤드셋의 자국 및 스트로빙 효과인 저더가 인식될 수 있습니다. 밑의 그림을 보면 프레임 기간 동안 픽셀이 조명되면 눈의 망막에 자국이 남습니다. 프레임 동안 디스플레이가 픽셀을 비추는 시간의 길이인 지속성을 낮추면 이러한 자국이 덜 보이지만. 그러나 프레임 간에 큰 변화가 있을 경우 여러 개의 개별 이미지가 인식되는 스트로빙으로 이어질 수 있습니다.

프레임이 떨어지면 더 심각한 경우가 발생한다. 여기에서는 화면에 무언가를 넣어야 하기 때문에 이전 프레임의 이미지를 사용하게 됩니다. 사용자 뷰에 대해 완벽하게 예측한다면 이미지를 수정하여 누락된 프레임에 이를 끼워맞출 수 있습니다. 이러한 작업을 타임 워프라고 하여 움직임에 맞추어 이를 교정 합니다. 속도를 넘어 순전히 회전 뒤틀림의 장점은 장면의 다른 요소들이 모두 일치하기에 보는 방향과 전체 방향만 잘 설정하면 빠르게 수정 가능합니다. 또한, 사용자가 위치를 이동하거나 이동하지 않더라도 헤드가 회전하거나 기울이면 눈의 위치를 변경됩니다. 이 때 생기는 이미지 왜곡도 적절하게 처리 해주어야 합니다.

위치 변경을 조정하려면 전체 3차원 재투영을 수행할 수 있습니다. 이미지의 모든 픽셀은 깊이와 연관되어 있으므로, 이 과정은 이 픽셀들을 세계의 그들의 위치에 투영하고, 눈의 위치를 이동한 다음, 이 점들을 다시 스크린으로 투영하는 것으로 생각할 수 있습니다. 앞서 얘기한 방법들의 문제는 색상이 이전 위치에 대해 계산된다는 것인데, 위치나 가시성은 이동 가능하지만 특정 반사는 변경되지 않습니다.

회전 보상 기법과 위치 보상 기법은 프레임 드롭에 대한 보험의 한 형태로 종종 별도의 비동기 프로세스로 실행되는데, 이러한 것을 비동기적 시공간왜곡 혹은 비동기적 재투영이라고 합니다. 이미지 기반이기 때문에 이 프로세스는 상당히 예측 가능한 시간이 소요되며, 이는 렌더링을 제때 완료할 수 없는 경우 일반적으로 재투사된 이미지를 사용할 수 있다는 것을 의미합니다.

21.4.2 Timing

비동기 시간 왜곡 및 공간 왜곡 기법이 판단을 피하는 데 도움이 될 수 있지만, 품질을 유지하기 위한 최선의 조언은 응용 프로그램 자체를 가능한 한 프레임이 떨어지는 것을 피하는 것입니다. 판단자가 없어도 표시 시 사용자의 실제 자세가 예측된 자세와 다를 수 있다는 점에 주목했습니다. 이와 같이, 후기 방향 뒤틀림이라고 불리는 기술은 사용자가 보아야 할 것을 더 잘 일치시키는 데 유용할 수 있습니다.

나중에 방향 데이터를 얻는 데 걸리는 시간은 이 프로세스가 별도의 CPU 스레드에서 실행되도록 함으로써 최소화될 수 있습니다. 이 CPU 스레드는 주기적으로 예측된 포즈를 GPU용 개인 버퍼로 전송하며, GPU는 이미지를 왜곡하기 전에 마지막 가능한 순간에 최신 설정을 잡아, 모든 헤드 포즈 데이터를 GPU에 직접 제공하기 위해 사용될 수 있습니다. 그렇게 하는 것은 GPU만이 이 정보를 제공하기 때문에 각 눈의 뷰 매트릭스를 그 순간에 응용 프로그램에서 사용할 수 없다는 한계를 가지고 있습니다.

위의 그림에서 CPU는 컴포지터가 끝날 때까지 처리를 시작하지 않기 때문에 CPU와 GPU에 상당한 다운타임이 있음을 알 수 있습니다. 모든 작업이 단일 프레임에서 수행되는 단일 CPU 시스템의 단순화된 보기입니다. 이는 파이프라인이 이루어지며, 여기서 GPU는 이전 프레임에서 CPU가 설정한 모든 것에 대해 작동합니다. 효과적으로 하기 위해서, CPU와 GPU는 각각 하나의 프레임보다 적게 거는 것이 좋습니다. 컴포지터는 종종 GPU가 언제 완료되었는지 알 수 있는 방법을 사용하는데, 이는 펜스라 불리며, 응용 프로그램에 의해 명령으로 실행되며, 완전히 실행되기 전에 모든 GPU 호출이 이루어졌을 때 신호를 보냅니다.

그림에 표시된 GPU 기간은 이미지를 렌더링하는 데 걸린 시간을 나타냅니다. 컴포지터가 최종 프레임을 만들고 표시하는 것이 끝나면 GPU는 다음 프레임의 렌더링을 시작할 준비가 됩니다. CPU는 컴포지팅이 완료될 때까지 기다려야 다음 프레임을 위해 GPU에 명령을 내릴 수 있습니다. 그러나 이미지가 표시될 때까지 기다리면 애플리케이션이 CPU에서 새로운 명령을 생성하는 데 걸리는 시간이 있는데, 이는 드라이버에 의해 해석되고 명령어는 마침내 GPU에 발행됩니다. 이 시간 동안 GPU는 유휴 상태가 되는데, 이 시간에 대해서 각 하드웨어에 따라 최적화시켜 사용하기도 합니다.

'그래픽 공부 > Realtime Rendering' 카테고리의 다른 글

Chapter 5. Shading Basics  (0) 2022.07.26
3. The Graphics Processing Unit  (0) 2022.07.12
2. The Graphics Rendering Pipeline  (0) 2022.07.11
8. Light and Color  (0) 2022.05.11

 

참조 : https://lifeisforu.tistory.com/368 사실 여기가 젤 설명 쉬움

이 챕터에서는 빛의 세기와 셰이딩에 의해 측정된 다양한 물리적 광량에 대해 알아보고, 보다 물리적으로 기반된 관점에서 렌더링을 논의하는 후속 챕터의 토대를 마련한다. 또한 렌더링 프로세스에서 선형적인 빛의 장면에서 최종 디스플레이 색상으로의 변환인 second half에 대해 알아보겠습니다.

8.1. Light Quantities


렌더링에 대한 물리적 기반 접근법의 첫 번째 단계는 빛을 정확한 방식으로 정량화하는 것입니다. 방사 측정(Radiometry)은 빛의 물리적 전달과 관련된 핵심 분야이기 때문에 먼저 소개되며, 우리는 인간의 눈의 민감도에 의해 가중되는 빛 값을 다루는 광도 측정(photometry)에 대한 논의가 뒤따라 옵니다. 색에 대한 우리의 인식은 정신물리학적 현상, 즉 물리적 자극에 대한 심리적 인식이기에 색측정(colorimetry)에 관해서도 알아볼 것이며, 마지막으로 RGB 색상 값에 대한 렌더링의 타당성에 대해 논의할 것입니다.

8.1.1 Radiometry

방사 측정은 전자기 방사선의 측정을 다룹니다. 파장이 다른 전자기파는 다른 성질을 가지며, 인간이 볼수 있는 빛은 400 ~ 700 nm로 이를 가시광선이라 부릅니다.

방사선량은 전자기 복사의 전체 에너지, 시간 경과에 따른 에너지, 면적, 방향 및 전력 밀도와 같은 다양한 측면을 측정하기 위해 존재합니다. 방사 측정에서 기본 단위는 방사속(radiant flux)이며, 방사속은 시간 경과에 따른 복사 에너지의 흐름을 와트(W)로 측정합니다.

방사 조도(Irradiance)는 면적에 대한 복사 유량의 밀도로 공간의 가상 영역일 수도 있지만 대부분 물체의 표면일 수도 있는 영역에 대해 정의되며 제곱미터당 와트로 측정됩니다.

이러한 얘기 전에 3차원적으로 확장한 입체각(solid angle)의 개념을 알 필요가 있는데 이는 평면에서 연속 방향 집합의 크기를 나타내는 척도로 생각할 수 있으며, 라디안의 값은 반지름 1인 원에서 동일한 길이로 교차하는 호의 길이와 같습니다. 마찬가지로 3차원 공간에서 연속적인 방향에 대해 입체각을 정의할 때는 steradians로 측정되며, 이는 반지름 1인 구에 대해 교차되는 패치의 면적에 의해 정의됩니다. 좀더 쉽게 설명하면 반지름이 r 인 구에서, 면적이 $r^2$ 인 면적을 포함하는 원뿔형의 각을 1 스테라디안( steradian, sr )이라고 부르고, 이러한 각도를 입체각이라 정의한 것입니다. 이는 4sr의 입체각이면 단위 구의 전체 영역을 덮을 수 있습니다.

복사 강도(radiant intensity)는 방향, 즉 입체각에 따른 방사속의 밀도를 얘기합니다. 이는 sr당 와트로 측정되빈다.

마지막으로 방사 휘도(radiance)는 전자기 복사의 척도로서 면적과 입체각 모두에 대한 방사속의 밀도로 구해집니다. 영역은 광선에 수직인 평면에 대해 구해지므로 투사된 영역을 구하기 위하여 cos이 보정으로 들어갑니다.

방사 휘도는 실제 시각 센서가 측정하는 값으로, 렌더링에서 중요시되는 부분입니다. 셰이더 방정식을 평가하는 목적은 주어진 빛에 대해서 특정 지점에서 카메라까지 들어오는 방사 휘도를 계산하기 위함입니다. 이 값은 sr 및 제곱미터 당 와트로 구해집니다.

방사 휘도는 5개의 변수(또는 파장을 포함한 6개의 변수)의 함수로 생각할 수 있으며, 이를 방사 휘도 분포(radiance distribution)라고 합니다. 변수 중 세 개는 위치를 지정하고 나머지 두 개는 방향을 지정하여 좌표 상의 모든 빛에 대해 기술 가능해집니다.

셰이딩 방정식에서, 복사 휘도광 종종 $L_o(x,d)$ 또는 $L_i(x,d)$ 형태로 표현되는데, 이는 각각 점 x에서 나오는 복사 휘도가 광선이 d로 나가는 것을 표현합니다. 복사 휘도는 거리 및 대기 효과를 무시하며 일정하게 유지도비니다.

대부분의 빛의 파동은 여러 파장들이 섞여 있는데, 이는 SPD(spectral power distribution)을 통해 파장의 분포를 나타낼 수 있습니다. 이는 같은 색이더라도 파장의 합성에 따라 분포가 달라질 수 있습니다.

모든 방사량에는 스펙트럼 분포가 존재하며 파장에 대한 밀도이기 때문에, 그 단위는 원래 양을 나노미터로 나눈 값입니다. 완전한 SPD는 시간이 많이 걸리기에 실제로는 RGB 값만을 활용합니다.

8.1.2 Photometry

방사 측정은 인간의 인식을 고려하지 않고 순수하게 물리적 양을 다룹니다. 관련 분야인 광도 측정은 방사 측정과 비슷하지만, 인간의 눈의 민감도에 가중치를 반영합니다.

변환 곡선과 측정 단위는 광도 측정 이론과 방사선 측정 이론 사이의 유일한 차이점으로, 각각의 방사선량은 동등한 측정 광도량을 갖습니다.

8.1.3 Colorimetry

빛에 대한 인식이 SPD처럼 단순히 일대일 대응에 해당하지 않는 것을 인지하였기에, 색측정법을 통해 스펙트럼 세기 분포와 색 지각 사이의 관계를 다룹니다.

인간은 약 천만 가지의 다른 색을 구별할 수 있는데, 우리의 뇌는 이 수용체들로부터 단지 세 가지의 다른 신호만을 받기에 3개의 숫자만으로도 어떤 색도 정확하게 나타낼 수 있습니다. 이러한 3개의 수는 각각 파장에 따라 다른 분포도를 가지며, 이들이 정점을 이루는 색상에 맞춰 red, green, blue라 부릅니다. 따라서 이러한 파장에 따른 분포도를 함수로 나타낸다면, 손쉽게 스펙트럼 세기 분포를 3개의 값으로 변환할 수 있습니다. 어떠한 단일 파장의 빛이든 스펙트럼의 빛이든, 이들을 실제 인지에 가까운 색상으로 나타낼 수 있게 합니다. 이러한 가중치를 주는 스펙트럼 분포를 metamers라고 합니다.

세 개의 가중치 있는 rgb는 다양한 파장에 대한 음의 가중치를 가지기 때문에 보이는 모든 색을 직접적으로 나타낼 수 없다. 따라서 실제 rgb가 아닌 가상의 광원에 대한 색상 일치 함수로 원래의 rgb를 기반으로하면서도 음의 가중치를 가지지 않는 함수가 제안되었습니다. 이들은 $\bar{x}(\lambda), \bar{y}(\lambda), \bar{z}(\lambda)$로 표시되며 색상 일치 함수는 휘도 곡선과 동일하며, 이 곡선과 함께 방사 휘도가 휘도로 변환됩니다. 이들은 곱셈과 적분을 통해 SPD를 3개의 수로 줄일 수 있습니다.

$$ X = \int_{380}^{780} s(\lambda)\bar{x}(\lambda)d\lambda \quad Y = \int_{380}^{780} s(\lambda)\bar{y}(\lambda)d\lambda \quad Z = \int_{380}^{780} s(\lambda)\bar{z}(\lambda)d\lambda $$

이러한 X, Y 및 Z 삼자극값(tristimulus values)은 CIE XYZ 공간의 색상을 정의하는 가중로, 색상을 휘도(밝기)와 색도(Chromaticity)로 구분하기에 편리합니다. 색도는 밝기와 무관한 색상의 특징으로, 밝고 어두움을 정의합니다. 이를 위해 CIE는 X + Y + Z = 1 평면에 색을 투영함으로써 2차원 색도 공간을 정의하였습니다.

$$ x= \frac{X}{X+Y+Z}, \quad y= \frac{Y}{X+Y+Z}, \quad z= \frac{Z}{X+Y+Z}= 1-x-y $$

요약하자면, 우리는 세 개의 단일 파장 빛을 사용한 실험을 기반으로, 다른 파장들이 어떻게 세 개의 빛으로 어떻게 구성되는지 파악하였고, 이를 통해 색상 매치 함수가 정의가능했습니다. 이를 통해 스펙트럼 분포를 색도와 휘도를 정의하는 XYZ 좌표로 변환시킬 수 있었으며, 이를 또 XY 좌표의 2차원으로 줄여 휘도를 일정하게 유지한 채 색도를 표현 가능토록 하였습니다.

색상 좌표 위의 점(x,y)이 지정된 경우 흰색 점으로부터 이 점을 통해 경계(분광선 또는 보라색 선)까지 선을 그립니다. 영역의 가장자리까지의 거리와 비교하여 색점의 상대적인 거리는 색상의 자극 순도(excitation purity)에 해당하며 영역 가장자리의 점이 우세한 파장을 정의합니다. 그래픽에서 자극 순도와 우세한 파장은 채도(saturation)와 색상(hue)으로 용어 대체가 가능합니다.

색도도는 평면에서 묘사되며, 색을 완전히 표현하기 위해 휘도에 해당하는 Y값의 차원을 추가로 필요로 합니다. 이는 xyY 좌표계로 정의되며, 색도도는 색상이 렌더링에 어떻게 사용되고 렌더링 시스템의 한계를 이해하는 데 중요합니다. 텔레비전이나 컴퓨터 모니터는 R, G, B 색상 값의 일부 설정을 사용하여 색상을 표시하는데, 각 색 채널은 특정 스펙트럼 전력 분포로 빛을 방출하게 하여 인간이 인식하는 단일 색으로 나타나게 됩니다.

색도도의 삼각형은 일반적인 텔레비전이나 컴퓨터 모니터의 색 전체를 나타냅니다. 삼각형의 세 모서리는 화면에 표시할 수 있는 가장 강력한 빨간색, 녹색 및 파란색인 기본 색상을 보여줍니다. 색도도는 이러한 제한 색상을 직선으로 연결하여 디스플레이 시스템 전체의 한계를 보여줄 수 있으며, 흰색 점은 R, G 및 B 색상 값이 서로 같을 때 디스플레이 시스템에 의해 생성되는 색도를 나타냅니다. 디스플레이 시스템의 전체는 3차원 볼륨이라는 점에 유의해야 하며, 색도도는 3차원을 2차원 평면에 투영된 것을 보여줍니다.

렌더링에 관련된 여러 RGB 공간이 있으며, 각각 R, G, B 원색 및 흰색 점을 바탕으로 정의됩니다. 위의 그림 중 sRGB는 실시간 렌더링에서 가장 일반적으로 사용됩니다. 대부분의 컴퓨터 모니터는 sRGB 색 공간을 위해 설계되었으며, HDTV 디스플레이에 사용되는 색 공간에도 동일한 기본 및 화이트 포인트가 적용되므로 게임기에 중요합니다. DCI-P3 색 공간은 처음에 장편 영화 제작을 위해 개발되었지만 현재 애플에 및 여러 제조업체에서 사용되고 있습니다. ACEScg 색 공간은 장편 컴퓨터 그래픽 렌더링을 위해 개발하여, 디스플레이 색 공간으로 사용하기 위한 것이 아닌 렌더링 후 적절한 디스플레이 색 공간으로 변환된 색상으로 렌더링하기 위해 만들어 졌습니다.

RGB 공간에서 XYZ 공간으로의 변환은 선형적이며 RGB 공간의 원점과 흰색 점으로부터 유도된 행렬로 계산 가능합니다. 또한 역으로 RGB 공간에서 XYZ 및 다른 RBG 공간으로 변환도 가능합니다. 이때 RGB 값은 [0, 1] 범위의 값을 가져야만 하며 이를 벗어나면 재현 불가능합니다. 이는 결국 표준 관측자의 눈이 다양한 파장에 어떻게 반응하는 지를 색에 곱하는 것이며, 이를 통해 휘도 방정식 및 색 방정식을 표현할 수 있습니다. 이러한 색측정법은 두가지 색이 일치 여부는 알 수 있지만, 어떻게 표현되는 지는 알 수 없습니다. 이는 조명과 여러 주변 환경에 크게 좌우됩니다.

8.1.4 Rendering with RGB Colors

엄밀히 말하면, RGB 값은 물리적 양보다는 지각적 양을 나타내기에 물리적 기반 렌더링에 사용하는 것은 기술적으로 범주 오류입니다. 정확하게 하기 위해서는 조밀한 샘플링이나 적절한 기반에 투영된 스펙트럼 양에 대한 모든 렌더링 계산을 수행하고 마지막에만 RGB 색상으로 변환해야 합니다.

예를 들어, 물체에 반사되는 빛을 계산한다고 하면, 파장에 따라 반사하는 비율이 변하기에, 입사광의 SPD에 각 파장의 스펙트럼 반사율을 곱하여 반사광의 SPD를 산출하고, 이 SPD는 RGB 색으로 변환시킵니다. 대신, RGB 렌더러에서 빛과 표면의 RGB 색상은 반사된 빛의 RGB 색을 내기 위해 함께 곱해진다. 일반적인 경우 이는 올바른 결과를 내지 못합니다. 특히, 레이저와 같이 일정 파장만 가지고 있는 경우는, 해당 파장은 잘 반사하지만, ㅏㄴ머지 빛은 흡수하게 됩니다. 하지만 일반적인 넓은 스펙트럼을 지니는 빛에 대해서 계산하는 경우는 오차가 상대적으로 적습니다. 예측 렌더링 애플리케이션에서 이러한 미묘한 오류는 중요할 수 있습니다. 그러나 대부분의 렌더링 시스템, 특히 인터랙티브 응용 프로그램용 렌더링 시스템의 경우 RGB 렌더링은 놀라울 정도로 잘 작동합니다.

8.2. Scene to Screen


주어진 가상 장면에서 물리적 기반 렌더링의 목표는 실제 장면처럼 해당 장면의 복사 광도를 계산해야 합니다. 이후에 디스플레이의 프레임 버퍼에 있는 픽셀 값을 구하여 화면에 표시를 해야하는데, 이번 장에서는 픽셀 값을 어떻게 구체화하는 지에 대해 알아보겠습니다.

8.2.1 High Dynamic Range Display Encoding

HDR 디스플레이는 sRGB와 동일한 흰색 점을 가지지만 보다 더 넓은 색역의 공간을 정의합니다. 하지만 HDR이 표현가능한 색을 표현 가능한 하드웨어가 별로 존재하지 않기에, HDR은 값을 내부적으로 실제 화면 값에 맞추는 톤 매핑을 수행합니다. 응용 프로그램 측에서는 HDR 디스플레이로 이미지를 전송하는 세 가지 경로가 있지만 디스플레이와 운영 체제에 따라 세 가지 경로 중 일부만 사용할 수도 있습니다.

  • HDR10 
    폭넓은 지원 대상이 존재하며, 프레임 버퍼 형식은 색채널당 10비트와 알파에 대해 2비트로 픽셀당 32비트의 형태를 띕니다. 비선형 인코딩을 사용합니다.
  • scRGB(선형 변형)
     Windows 운영 체제에서만 지원되며 일반적으로 sRGB와 유사하지만 0보다 작고 1보다 큰 RGB 값을 지원합니다. 프레임 버퍼 형식은 채널당 16비트이며 선형 RGB 값을 저장합니다. sRGB와의 후방 호환성과 편의성을 위해 주로 유용합니다.
  • Dolby Vision
     독자적인 형식이며, 아직 디스플레이 또는 콘솔에서 널리 지원되지 않습니다. 채널 프레임 버퍼 형식당 사용자 지정 12비트를 사용합니다.

scRGB 이외의 옵션을 사용하면, 디스플레이 인코딩 단계의 일부로서 행렬 변환 및 인코딩을 수행해야 하기에 더 많은 비용을 필요로 합니다.

8.2.2 Tone Mapping

디스플레이 하드웨어에 대한 선형 방사 휘도 값을 비선형 코드 값으로 변환하는 프로세스인 디스플레이 인코딩에 대해 논의했습니다. 디스플레이 인코딩에 의해 적용되는 함수는 입력 선형 값이 디스플레이에서 방출되는 선형 방사선과 일치하도록 하는 EOTF 함수의 역함수입니다.

톤 매핑 또는 톤 복제는 장면의 복사 휘도 값을 디스플레이 복사 휘도 값으로 변환하는 프로세스입니다. 이 단계에서 적용되는 변환을 종단 간 전송 함수 또는 장면 대 화면 변환이라고 합니다. 보통 두 가지 기본 이미지 상태가 존재합니다. Scene-referred 이미지는 장면의 복사 휘도 값을 기준으로 정의되며, display-referred 이미지는 화면의 복사 휘도 값을 기준으로 정의됩니다. 둘 중 하나의 상태의 이미지들은 선형 또는 비선형적으로 인코딩될 수 있다. 아래의 그림은 이미지 상태, 톤 매핑 및 디스플레이 인코딩이 초기 렌더링에서 최종 디스플레이까지 색상 값을 처리하는 이미지 파이프라인에서 어떻게 사용되는 지를 보여줍니다.

톤 매핑의 목표에 관한 몇 가지 일반적인 오해가 있다. 이는 장면에서 화면으로의 변환이 화면에서 장면으로의 복사 휘도 값을 완벽하게 재현하는 변환임을 보장하지 않으며, 장면의 높은 동적 범위에서 화면의 낮은 동적 범위로 모든 정보를 압착하는 것은 아닙니다. 톤 매핑은 이미지 재생과 유사한데, 이는 원본 장면을 관찰할 때의 지각 능력을 최대한 비슷하게 만드는 화면을 만들려고 하는 것입니다.

일반적인 장면의 휘도 범위가 하드웨어의 능력을 몇 배 이상 초과하는 것을 고려할 때 이는 상당히 어려운 목표입니다. 하지만 인간 시각 시스템의 특성을 활용하여 최대한 살려낼 수는 있습니다. 주변 장치를 만든 주변과 화면의 상대적인 차이를 통해 인지하는 시각 시스템은 절대적인 수치를 일부분 보완할 수 있지만, 색채와 휘도에 대한 낮은 인식은 보완하기 어렵습니다. 하지만 역으로 대조를 사용하게 된다면, 단점이 더 두각될 수도 있는데, 대조를 증가시키기 위해서는 어둡거나 밝은 경계를 통해 화면의 범위를 좁혀야 하는데, 대조에 의해서 좁은 화면이 더 좁게 보일 수도 있습니다. 따라서 경계를 부드럽게 사용하여 그림자와 하이라이트 디테일을 재현하기도 합니다.

빛의 양을 조절하는 노출의 개념은 톤 매핑에 매우 중요한데, 렌더링에서는 Scene-referred 이미지에 대해 선형적으로 수행되므로, 이에 맞는 scaling factor를 잘 설정해야 합니다.

노출에 의한 스케일링 후 톤 재생 변환을 적용하는 과정은 모든 픽셀에 동일한 매핑이 적용되는 글로벌 톤 매핑의 한 유형이며, 대조적으로 로컬 톤 매핑 프로세스는 주변 픽셀과 다른 요소를 기반으로 픽셀 간 매핑을 사용합니다. scene-referred 이미지와 display-referred 이미지는 디스플레이 한계와 우리가 논의한 다양한 지각 효과로 인해 다르기에, 두 이미지 상태 사이에는 항상 비선형 변환이 필요합니다.

 

[Tone Reproduction Transform]

톤 재생 변환은 종종 scene-referred 입력 값을 display-referred 출력 값에 매핑하는 1차원 곡선으로 표현하며 이는 R, G 및 B 값에 적용되거나 휘도에 독립적으로 적용할 수 있습니다. 전자의 경우, display-referred RGB 채널 값이 각각 0과 1 사이에 있기 때문에 결과는 자동적으로 디스플레이 색역에 있게 됩니다. 그러나 RGB 채널에서 비선형 연산을 수행하면 원하는 밝기 변화 외에도 채도와 색상의 변화가 발생할 수 있습니다. 이러한 색상 변화는 일반적으로 바람직하지 않은 것으로 간주되며, 톤 곡선 후에 RGB 조정과 같은 추가적인 작업을 통해 해결하고자 하고 있습니다. 톤 곡선을 휘도에 적용하면 색상 및 채도 변화를 피할 수 있습니다. 그러나 display-referred 색상은 디스플레이의 RGB 색역을 벗어날 수 있으며, 이 경우 다시 매핑해야 합니다. 톤 매핑의 한 가지 잠재적인 문제는 scene-referred 픽셀 색상에 비선형 함수를 적용하면 일부 앤티앨리어싱 기술에 문제가 발생할 수 있다는 것입니다.

 

[Exposure]

노출을 계산하기 위해 일반적으로 사용되는 기술 계열은 scene-referred 휘도 값 분석에 의존합니다. 정지되지 않도록 분석은 일반적으로 이전 프레임을 샘플링하여 수행됩니다.

이전에는 노출은 프레임 당 프레임당 하나의 값이 남을 때까지 일련의 다운 샘플링을 통해 로그 평균 값을 이용하는 로그 평균 장면 휘도가 사용되었습니다. 평균 값을 사용하면 소수의 밝은 픽셀이 전체 프레임의 노출에 영향을 미칠 수 있는 이상치에 너무 민감한 경향을 보입니다. 따라서 이후의 구현에서는 휘도 값의 히스토그램을 사용하여 이 문제를 개선했습니다. 평균 대신 히스토그램을 사용하면 중앙값을 계산할 수 있으므로 더 견고합니다. 히스토그램의 추가 데이터 점을 사용하여 결과를 개선할 수 있습니다.

8.2.3 Color Grading

즉 원본 장면보다 어떤 의미에서는 더 나아 보이는 이미지를 생성하는 아이디어를 언급하였는데 이는 색선별이라 불리는 이미지 색을 창조적으로 다루는 것에 해당합니다. 색 선별은 원하는 장면이 될 때까지 예제 장면 이미지의 색상과 수동적으로 상호작용 시킵니다.

 

'그래픽 공부 > Realtime Rendering' 카테고리의 다른 글

Chapter 5. Shading Basics  (0) 2022.07.26
3. The Graphics Processing Unit  (0) 2022.07.12
2. The Graphics Rendering Pipeline  (0) 2022.07.11
21. Virtual and Augmented Reality  (0) 2022.05.11

+ Recent posts