http://coreafive.tistory.com/46
NiAlphaAccumlator
Z버퍼 어플리케이션이 알파 블랜딩된 오브젝트들을 씬 그래프의 원하는
어디에든 놓으면서 렌더링을 정확하게 처리할 수 있도록 해주는 accumulator입니다.
알파블랜딩된 오브젝트들은 서로와 관련하여 정렬된
순서로 그려야 합니다.
알파 블랜딩된 오브젝트들을 마지막에 정렬된 순서대로 그리지 않으면 시각적인 인위적 현상이 생길 수 있다.
이
accumlator는 불투명한 오브젝트드를 정렬하는 불필요한 작업을 없애주면서 알파 블랜딩된 오브젝트들은 뒤에서 앞으로
정렬합니다.
accumlator는 알파 블랜딩 오브젝트들만 미뤄두고 알파블랜딩이 꺼진 오브젝트들은 RegisterObjectArray에
대한 호출 동안에 즉시 렌더링되게 놔둡니다.
각 오브젝트들의 경계 영역의 중심점이나 가장 앞쪽의 점을 바탕으로 간단한 z-sort를 통해
이들을 정렬함으로써 이를 달성합니다.
이런식으로 모든 불투명한 오브젝트가 씬 그래프에서 운행되는 순서대로 제일 먼저 그려진 뒤에, 그 다음
알파 블랜딩된 오브젝트들이 뒤에서 앞으로 정렬된 순서대로 그려집니다.
NiStream
게임브리오 익스포트를
통해 익스포트한 씬 그래프를 로드해야 할때나, 자체적인 어플리케이션으로 미리 저장해둔 씬 그래프를 로드하려고 할 때 사용되어집니다.
여기서
NIF파일을 로드하기 위해 NiApplication::ConvertMediaFilename함수를 사용하는
데, 이 함수는 SetMediaPath로 지정된 경로를 사용해서 완전한 경로를 생성합니다.
bool
NIF_Files::CreateScene()
{
// 불투명 오브젝트를 먼저 그린 뒤에,
// 알파 블랜딩된 오브젝트를
z-sort에 따라 순서대로 뒤에서부터 앞으로 그리도록
//
알파 블랜딩 정렬을 설정한다.
NiAlphaAccumulator* pkAccum = NiNew
NiAlphaAccumulator;
m_spRenderer->SetSorter(pkAccum);
NiStream kStream;
bool bSuccess = kStream.Load(
NiApplication::ConvertMediaFilename( "WORLD.NIF" ) );
if( !bSuccess )
{
//
예외처리
return false;
}
// 최상위 노드를 리턴하여 저장한다.
m_spScene = (NiNode*)kStream.GetObjectAt(0);
// NIF파일에 등록되어있는 카메라를 검색하여 설정하도록
처리합니다.
if( !FindSceneCamera() )
{
// 예외처리
return
false;
}
}
NiCamera
씬
그래프의 카메라를 나타냅니다.
이 객체는 고유의 기하하적 표현이 없으나 월드 공간에서 자신의 위치와 방향을 결정하기 위해 부모의 변환을
이용합니다. 이런 구성은 게임브리오에서 카메라가 씬 그래프에 어태치되게 해주며, 안에 있는 카메라와 유도 카메라를 자동으로 따라다니게
만듭니다.
NiNode
신 그래프의 내부 노드를 나타냅니다.
이 노드들은 임의의 개수를
자식으로 가질 수 있으며 Dynamic Effect는 영향을 줄 노드를 지정하는 데, 이 경우 서브트리에서 한 노드에 루트를 두고 있는 모든
객체들이 영향을 받게 됩니다.
노드 서브클래스들은 그 밑에 있는 서브트리에 대한 정렬 동작을 조절할 수 있습니다.
NiNode는 또한
피킹 시스템과 충돌 검사 시스템에 호출의 재귀적인 전달도 제공합니다.
bool
NIF_Files::FindSceneCamera()
{
if( m_spScene )
{
// 씬에 설치된 카메라를
찾아서 리턴받아 저장하도록 처리한다.
m_spCamera = FindCamera( m_spScene
);
}
return (m_spCamera != NULL);
}
NiCamera* NIF_Files::FindCamera( NiAVObject* pkObject )
{
// 카메라 타입인지를
검사한다.
// 그래서 이게 true라면 카메라 타입으므로
// 변환한 후 리턴한다.
if( NiIsKindOf(
NiCamera, pkObject ) )
{
return (NiCamera*)pkObject);
}
//
노드 타입인지를 검사하여 노드 타입이면 실행한다.
else if( NiIsKindOf( NiNode, pkObject )
)
{
// 노드 타입의 객체로 형변환한다.
NiNode* pkNode = (NiNode*)
pkObject;
// 노드의 자식
개수만큼 루프를 실행한다.
for (unsigned int ui = 0; ui <
pkNode->GetArrayCount(); ui++)
{
// 카메라 타입의 노드를
찾는다.
// 즉 카메라가 여러개 있어도 가장 먼저 찾는 놈을 리턴하도록 처리되겠다.
NiCamera* pkFoundCamera = FindCamera(pkNode->GetAt(ui));
if
(pkFoundCamera)
return pkFoundCamera;
}
}
}