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;
}
}
}

반응형

+ Recent posts