10. Frame Buffers

햄스터·2025년 6월 15일

ComputerGraphics

목록 보기
9/11

Frame Buffers

Frame buffer는 rendering pipeline에서 생긴 fragment를 저장합니다.

2D Memory Space구요.

Standard Buffer로 Front buffer, back buffer, depth buffer를 사용하고,
Additional Buffer로 Stencil buffer를 사용합니다.

언젠가 buffer를 2개를 두는 이유를 설명한 적이 있었습니다.
하나는 바로 렌더링되는 화면이고, 하나는 계산되는 화면이었죠.

일반적인 Frame Buffer는 ResolutionBit depth로 정의됩니다.

유명한 Bit Depth들은 8bpp, 24bpp, 32bpp (RGBA)가 있구요.
텍스처와 뭔가 비슷하죠?

그래서 텍스처도 Frame buffer로 쓸 수 있습니다.
그런 텍스처를 Render Target이라고 부릅니다.

보통의 Scenario에선 Color buffer만 중요합니다.
어떻게 color buffer를 잘 쓸 수 있을지.

특히 Stencil buffer는 요즘 OpenGL에선 잘 안 씁니다.

? Depth buffer는요?

자주 본 친구인데 많이 안 쓰인다고 하니까 당황스럽죠.
그건 Depth Output을 Color에 통합시킬 수 있기 때문입니다. (RGBZ)

Reading from Frame Buffers


다음 Flow를 따르는데요.
Write는 그냥 draw call로 그리는건데, Read는 좀 오래 걸립니다.

이 Read는 좀 오래 걸려서, 영상제작이나 캡처링 빼고는 안 씁니다.

Application에서 Driver한테 command를 보냅니다.
그 Command가 GPU의 command buffer에 쌓이구요.
GPU한테 전달이 되면
GPU가 Frame buffer에서 읽어 옵니다.

저기 command buffer에 쌓이는 작업이라는 건, 한번에 바로 읽어내지 못하고
일정 시간 (delay)가 필수불가결하다는 뜻이구요.

그러니까 느립니다.
그래서 디버깅이나 화면캡처 외에는 안 쓴다는 겁니다.

Post-fragment Operations and Compositing

어우. 이게 뭘까요.
Fragment Shader를 거친 이후, 픽셀이 Frame Buffer에 쓰이기 이전에
GPU가 실행하는 최종 필터링 단계를 의미합니다.

Depth Buffering이 있구요.
Linear Blending으로 Alpha channel을 이용해 Alpha blending을 하는 게 있구요.

Logical Operations이 있습니다.
logical operation은 좀 advanced된 개념이구요.
이걸 쓰기 위해선 integer-format frame buffer가 필요합니다.

이건 On-the-fly voxelization같은 경우에 쓰입니다.
실시간으로 3D 모델을 복셀 (Voxel)로 변환하는 과정이죠.

Depth Buffering


이젠 자주 본 사진입니다.

Fragment가 COP까지 갖는 거리인 depth를 기록을 하구요.

Fragment depth가 존재하는 depth보다 크다면 discard해야겠죠.
만약 더 작다면 그 depth를 기록할 필요가 있겠습니다.

Blending in Frame Buffers

alpha value를 가진 fragment output과,
alpha value를 가진 frame buffer 내의 frame color를 합칩니다.

Blending은 Host Application에 명시되어 있어서,
OpenGL한테 직접 어떻게 fragment랑 frame buffer value를 섞어라~ 하고 말해줄 필요가 있습니다.

허용된 operation은 보통 linear blending입니다.

Opacity and Transparency

자연스럽게 넘어갔는데요, alpha value가 뭘까요?

alpha value는 Opacity입니다.

A=0A=0이라는 건 완전투명이구요, A=1A=1은 완전불투명입니다.
그래서 Transluency를 1A1-A로 정의할 수 있죠.

Transluency는 렌더링의 과제 중 하나인데요.

물리적으로 그대로 구현하려면 물체의 빛 산란 구조 까지 파고 들어야 해서,
복잡할수밖에 없습니다.

조금 정확히는, Order of Rendering이 상당히 중요합니다.

Order Dependency


이 이미지가..맞나요? 아마 아닌것같죠.

Polygon들은 우리 파이프라인을 따라서 application이 만든 순서를 따라 만들어집니다.
근데, blending은 order가 중요합니다.

조금 더 자연어로 말하면 GPU는 어떤 면이 앞에 있고 어떤 면이 뒤에 있는지 모릅니다.
그냥 Application이 제출한 순서 그대로 처리하죠.

불투명하면 그냥 Depth Test에서 날려버리면 되는데,
투명한 객체는 깨지는 현상이 생깁니다.

그말은, 우리는 Translucent Object에 대해서 Back-to-front 방식으로 렌더링을 해야 한다는걸 말합니다.

그래서, 이 토성의 고리 (앞쪽 주목)처럼,

Opaque (불투명)한 물체를 먼저 frame buffer에 집어넣고,
Translucent object를 그 다음 back-to-front order로 frame buffer와 섞을 필요가 있습니다.


가장 미개하게 Alpha blending을 실행하는 방법입니다.

만약 SaS_a가 1이라면 fragment가 완벽하게 opaque해져서
destination의 값이 source의 값으로 덮어씌워질거고,

SaS_a가 0이라면 source의 fragment는 무시되겠죠.

0<Sa<10<S_a<1인 경우에 blend가 될 겁니다.


이렇게 jaggy한 선을 anti-aliasing할 때에도,neighboring pixel의 값을 섞되,
여기서도 alpha blending이 일어나 근처의 선들이 어느정도 투명도를 갖고 보일 수 있게 되겠죠.

Additive Blending

이런 식을 가지는 Blending이 있는데요.
뭔가 + 후면이 이상하죠.

이런 식으로 빛의 누적 효과를 나타내고 싶을 때, 사용합니다.
Heatmap처럼요.

Compositing

Blending의 가장 큰 단점은 Frame buffer에 대한 Control이 불가하다는 것입니다.

Compositing은 좀 비슷한데요.

미리 render된 texture끼리 후처리로 섞는걸 Compositing이라고 합니다.

Blending을 하는건데, Rendered Input을 사용하는것이죠.
그걸 Compositing이라고 합니다.

Blending은 Fragment랑 Fragment buffer랑 실시간으로 섞는거고,
Compositing은 이미 렌더된 이미지들끼리 수동으로 합치는거에요.

가령 배경 texture와 alpha값을 가진 나뭇잎 object가 있다면,

Blending을 끄고 내가 직접 alpha blending equation을 이용해 섞으면 그게 Compositing입니다.

Blending은 Frame buffer의 값을 못 읽어오고, (파이프라인의 일부라서)
선형 혼합만 지원하기 때문에 Compositing을 쓰죠.

FBO (Frame Buffer Object)

아까 Texture를 Frame buffer처럼 쓸 수 있다고 했습니다.
왜냐면 Texture도 물리적으로 같은 memory area에 머물기 때문이죠.

그래서 우리는 Texture를 Frame buffer로 간주하고 거기다가 Rendering할 수 있습니다.

그런 frame buffer를 FBO라고 합니다.

RTT (Render To Texture)

FBO는 우리한테 Texture에 Render가 가능하게 해줍니다.
렌더링 된 결과물은 이제 Texture Memory에 저장이 되게 되구요.

많은 Postprocessing을 위한 primitive의 역할을 합니다.

예시를 볼까요?

Deferred Rendering

Multi-pass approach를 이용합니다. 단, Geometry pass를 한 번만 합니다.

Geometry가 pass되면, G-buffer에 물체 정보를 저장합니다.
그 후 저장된 정보를 바탕으로 Lighting과 Shading을 적용하구요.

그 후 Shadow Pass, Post-processing (motion blur...) 등을 적용합니다.


Geometry Passing에서 normal, color, depth, specular 등의 정보가 다 전달이 되면,

G-buffer에서 그걸 읽어서 실제 조명을 적용한 결과를 내는것입니다.

profile
햄스터가 세상을 지배한다.

0개의 댓글