본문 바로가기
Programming/Game

알파 오브젝트 정렬

by 작은별하나 2011. 9. 19.
반응형

며칠전에 알파 블렌딩 때 오류가 난나는 분의 문의 메일을 받았는데, 이유는 그것이 아니었지만,

알파 블렌딩에서 필요한 요소 기술들을 많이 모르고 있어서 여기에 소개하고자 합니다.

알파 블렌딩을 할 때, 제일 먼저 신경 써주어야 하는 것은 그리는 순서입니다.

불투명 오브젝트는 Z-Buffer(또는 뎁스버퍼)의 도움으로 그리는 순서에 상관없이 카메라로부터 가까운 거리의 오브젝트는 먼 거리의 오브젝트를 가리게 됩니다.

그러나 투명 오브젝트는 Z-Buffer의 도움을 받을 수가 없죠. 그리는 순서에 따라서 결과값이 달라지게 됩니다.

예를 들어서 노란색에 50% 투명도를 가지고 있는 오브젝트 A와 파란색에 50% 투명도를 가지고 있는 오브젝트 B가 있다고 하죠.

A 오브젝트가 B 오브젝트에 비해서 카메라로부터 거리가 더 멀다고 하면,

A->B 순서대로 그리는 것과 B->A 순서대로 그리는 것은 다음 그림과 같이 달라지게 됩니다.

A 오브젝트가 먼저 그려지면, 배경과 블렌딩되어서 오브젝트가 노란색으로 그려집니다. 그런 후 B 오브젝트가 그려지면, 카메라로부터 거리가 더 가깝기 때문에 Z-Buffer 테스팅을 통과하게 되고 A 오브젝트와 일부분은 블렌딩됩니다. 그러나 반대의 순서로 그려지면 B 오브젝트가 먼저 그려지고, A 오브젝트는 B 오브젝트보다 더 뒤에 있기 때문에 B 오브젝트는 자연스럽게 블렌딩될 수가 없습니다.

이러한 현상을 막는 방법은 그림을 그리는 순서가 카메라로부터 먼 곳부터 가까운 곳으로 그리도록 하는 것입니다. 이것을 알파 정렬(Alpha Soring)이라고 일반적으로 말합니다.

게임브리오 엔진에서는 NiAlphaAccumulator 클래스가 이 역할을 합니다.

 

NiAlphaAccumulatorPtr spAlphaSorter;
m_spRenderer->SetSorter(spAlphaSorter);
spAlphaSorter->StartAccumulating(m_spCamera);
.... ...
spAlphaSorter->FinishAccumulating();

 

이렇게 하면 그림을 그릴 때, 알파 블렌딩이 요구되는 오브젝트들은 바로 그리지 않고 spAlphaSorter에 저장이 됩니다. 그런 후 FinishAccumulating에 의해서 알파 블렌딩 오브젝트들이 그려지게 됩니다.

알파 정렬은 매우 좋은 방법이긴 하지만, 몇가지 경우에 있어서 심각한 오류를 발생시킵니다.

가장 좋은 방법은 역시 BSP 엔진과 갈이 절대 그리는 순서가 바뀌지 않도록 하는 것이긴 하지만, BSP는 모델을 제작하는데 제약이 따르고 모델 오브젝트를 구성하는데 있어서 애로가 있습니다.

알파 정렬을 하는데 있어서 오류가 발생되는 예는 나중에 시간이 나면 다시 언급하도록 하죠.

728x90

'Programming > Game' 카테고리의 다른 글

Z Buffer vs. W Buffer  (0) 2011.09.22
Culling vs. Clipping  (0) 2011.09.21
이벤트 핸들링에서의 case 문장  (0) 2011.09.16
조건문의 최적화 방법  (0) 2011.09.16

댓글