반응형
개요
- infer : 추론하다, 추측하다, 언급하다.
- 낮은 해상도에서 Lighting을 수행한다.
- 따라서 Material Shader가 낮은 해상도에서도 정확한 Lighting 값을 "추론"할 수 있는 Filtering Algorithm이 중요함
- 총 3번의 Rendering Pass가 필요하다. 하지만 투명한 오브젝트에 대해서 별도의 렌더링이 필요하지 않다.
- 최종 결과물은 HW Anti-Aliasing이 적용되도록 한다.
- Light Pre-pass는 투명한 오브젝트를 그릴 때 Forward Rendering이 필요함
- Light Pre-pass는 Light Buffer의 해상도가 커야 함 (=Full resolution)
- Light Pre-pass나 Standard Deferred에 비해서 기본 Render Cost가 높음
- Light가 없거나 적어도...
구현
Geometry Pass
- Input : Normal, Depth, DSF(=Discontinuity Sensitive Filter) Data
- Output : G-Buffer (=Geometry Buffer)
- Low Resolution
- Normal은 RG16을 사용하여 x, y만 저장하고 z는 계산함
- DSF 정보도 RG16 사용하며 depth와 ID를 저장함
- 하단의 DSF 섹션 참고
- 구현이나 필요성에 따라서 Spec Power, Material ID, Motion Vector 등을 저장 가능
Light Pass
- Ambient와 Dynamic Light를 계산한다.
- Input : G-Buffer
- Output : L-Buffer (=Light Buffer), Low Resolution
- RGBA16 사용
- RGB : Diffuse
- A : Specular Intensity (Specular Color는 Material Pass에서 Diffuse Light Color를 이용)
- Light가 영향을 주는 영역만 Stencil을 이용해서 그리도록 하자.
Material Pass
- Input : L-Buffer
- Output : Frame Buffer
- Full Resolution
이 Pass에서 Lighting을 수행하는데 불투명한 오브젝트와 투명한 오브젝트를 같이 그리기 때문에 순서가 중요하다.
- 불투명한 오브젝트를 그린다.
- 투명한 오브젝트를 Back-to-Front 순서로 그린다.
DSF
- Geometry Pass와 Lighting Pass에서 사용하는 Buffer의 해상도가 Material Pass의 해상도보다 작기 때문에 Aliasing이 발생하며 이를 DSF를 사용하여 해결한다. (자꾸 DSF 필터라고 부르고 싶음)
점선 : FrameBuffer, 실선 : LightBuffer
회색으로 칠한 Fragment의 픽셀 P를 그릴 때 a, b, c만 Lighting에 포함되고 d는 버려짐
Object, Normal Group ID
DSF 정보는 총 16Bit
상위 8Bit : Object ID (실제 Scene에 그려질 때 부여 됨)
하위 8Bit : Normal Group ID (미리 계산하고 부여할 수 있음)
이렇게 8Bit씩 나누어서 ID를 부여하기 때문에 실제로는 다른 Object지만 ID를 공유하는 경우가 생기고 이론상으로는 Visual Artifact가 생겨야 한다. 하지만 실제로 눈에 띄는 부작용은 거의 생기지 않는다고 한다.
2개의 인접한 삼각형의 Vertex가 같은 Normal을 사용하면 같은 Normal Group이라고 봄
Alpha Polygon
구현
- Geometry Pass에서 투명한 물체를 Stipple(=점묘법) 패턴으로 그린다.
- Light Pass에서는 이렇게 점으로 그려진 투명한 물체도 같이 Lighting 된다.
- Material Pass
- 불투명한 물체의 DSF에서 이렇게 Stipple로 그려진 Alpha Pixel은 무시된다.
- 투명한 물체의 DSF는 같은 Stipple로 그려진 4개의 Light Buffer 샘플을 가지고 이뤄진다.
제약
- Stipple 패턴이 보통 2x2 픽셀을 사용하기 때문에 투명한 물체는 불투명한 물체의 절반 해상도 Lighting이 된다.
- 2x2 패턴 : 3 Alpha Layer + 불투명한 오브젝트
- 4x4 패턴 : 15 Alpha Layer + 불투명한 오브젝트 (단 패턴이 커질수록 해상도가 많이 떨어짐)
- 반대로 불투명한 물체는 투명한 물체가 픽셀을 차지하고 있는만큼 Light Buffer 사용이 불가능하다.
왼쪽 : Light Buffer에 Stipple 패턴으로 그려진 투명한 물체
오른쪽 : 투명한 물체에 초록, 파랑색으로 Lighting도 잘 된 최종 결과
T1~T3 : Transparent Object / O : Opaque Object
2x2 패턴에서 3개의 투명 물체로 모든 Layer를 다 사용한 모습
개선점
- 높은 편에 속하는 기본 Rendering Cost를 줄여야 한다.
- DSF는 4번의 Sampling이 필요한데 HW에서 지원하는 Bilinear Filtering으로 바꿔본다.
- Layer 개수에 제한이 있는 투명한 물체
참고
http://www.students.science.uu.nl/~3220516/advancedgraphics/papers/inferred_lighting.pdf
https://mynameismjp.wordpress.com/2010/01/10/inferred-rendering/
반응형
'Game Dev > Article' 카테고리의 다른 글
Forward+ Rendering (1) | 2016.10.19 |
---|---|
Premultiplied alpha (0) | 2016.10.14 |
Light Pre-Pass Renderering (=Deferred Lighting) (0) | 2016.10.09 |
Light Indexed Deferred Rendering (0) | 2016.10.08 |