2008년 11월 20일 목요일

KGC2008

지난주에 KGC2008에 하루 참가했었다
기대는 그닥 안했지만 GSTAR도 볼겸해서 갔었는데
IK / Visual material tool / Scaleform 에 관한 발표를 듣고왔다

IK 의 경우 모션 블랜딩/ 애니메이션합성 / 몇가지 기본적인 IK에대한 설명이 있었다

Visual material tool
툴에서 시각적으로 머터리얼을 구성할수 있게한다
구성된 머터리얼에 관한 쉐이더파일을 자동으로 생성해주며 이를 이용한 각종 효과를 만들어내는것을 볼수 있었다

Scaleform
스케일폼은 플래쉬UI를 게임에서 사용할수 있게 해주는 미들웨어이다
기본적인 UI및 채팅, Drag & Drop, 3D UI, 미니게임등을 플래쉬를 이용하여 제작할수있다
동영상부분도 곧 지원할 예정

미들웨어 사용은 개인적으로도 필요하다고 생각하는편인데 꽤 쓸만한거 같다
모든걸 다 만들수는 없으니 미들웨어를 적극사용하고 랜더링 엔진에 집중하는게 낫다고 보는데
랜더링 엔진도 워낙 뛰어난게 많이 나와있어서 ㄷㄷㄷ

관심있거나 사용해본 미들웨어/라이브러리
OpenAL : 사운드 라이브러리
Zlib : zip 압축
Scaleform : UI
PhysX : 물리엔진
Speedtree : 나무생성

2008년 11월 19일 수요일

Singleton

아래와 같은 Meyers 아저씨의 싱글톤을 별 문제없이 사용 중 싱글톤 소멸에 관련한 에러 발생.
DXUT 구조에서 OnCreateDevice()에서 처음으로 접근(생성) 하고 OnDestroyDevice() 에서 다시 접근시
이미 싱글톤객체가 소멸되어 있음.

template
class Singleton
{
public:
static T* Instance()
{
if (!ms_pkInstance)
CreateInstance();
return ms_pkInstance;
}

static void CreateInstance()
{
static T kInstance;
ms_pkInstance = &kInstance;
}

private:
static T* ms_pkInstance;
};


template
T* Singleton::ms_pkInstance = 0;

해결방안..

모던 C++에서 소개한 방법 중 불사조 싱글톤의 구현
destroyed_ 변수를 추가하여 소멸되었는지를 판단 후 소멸되었을 경우 다시 생성
부활한 싱글톤은 atexit() 함수를 사용하여 소멸 예약

atexit() 문제발생 : C++표준의원회에서 고칠거라고는 하지만 WindowsXP/VS2005 에서 문제가 있으므로 일단 아래 방법제시

1.메모리 누수 방치 --;; : 누적되지 않고 프로그램 종료 시에만 발생되므로 OS에서 알아서 회수할 거임.
2.싱글톤 생성 시기 조절 : 프로그램 시작부근에서 CreateInstance()를 호출해주면 오래 살아남음 ;;
3.강제 소멸 : 더 이상 필요 없을 경우 KillPhoenixSingleton()함수로 강제 소멸
4.??

참고자료 : 모던 C++디자인

-> 그 외 싱글톤의 수명제어 및 멀티스레딩에 관련된 부분. 각각의 기능을 템플릿으로 나누어 조합할 수 있게 하는 것 등 소개

template
class PhoenixSingleton
{
public:
static T& Instance()
{
if (!ms_pkInstance)
{
if (destoryed_)
{
// Dead Reference
CreateInstance();
new(ms_pkInstance) T;
#ifdef ATEXIT_FIXED
atexit(KillPhoenixSingleton);
#else
destoryedOnce_ = true;
#endif // ATEXIT_FIXED

destoryed_ = false;
}
else
{
CreateInstance();
}
}
return *ms_pkInstance;

}

static void CreateInstance()
{
static T kInstance;
ms_pkInstance = &kInstance;
}

static void KillPhoenixSingleton()
{
#ifndef ATEXIT_FIXED
if(destoryedOnce_)
#endif // ATEXIT_FIXED
ms_pkInstance->~T();
}
protected:
virtual ~PhoenixSingleton()
{
ms_pkInstance = 0;
destoryed_ = true;
}

static T* ms_pkInstance;
static bool destoryed_;

#ifndef ATEXIT_FIXED
static bool destoryedOnce_;
#endif // ATEXIT_FIXED

};

template
T* PhoenixSingleton::ms_pkInstance = 0;
template
bool PhoenixSingleton::destoryed_ = false;

#ifndef ATEXIT_FIXED
template
bool PhoenixSingleton::destoryedOnce_ = false;
#endif // ATEXIT_FIXED

2008년 11월 18일 화요일

억새풀

2008/10 명성산 억새풀밭

Tone mapping

톤맵핑은 전체신의 현재 밝기를 계산하여 전체적인 톤을 조절하는것. .끝 -_-;;
- 전체신의 밝기계산은 다운샘플링을 이용한다
- 기존의 값과 변경되는 값의 변화를 서서히 적용하면 사람 눈의 암(명)적응과 같은 효과를 나타낼수있다
- 사실 구현한지 좀 되서리 구체적인내용까지는 생각나지 않는다 조만간 다시봐야되므로 그때 좀더 추가할것임.

Ambient Occlusion

SHADOW 기법의 하나로 주변광의 적용
주변광의 차단을 계산하여 음영값을 구한다

------------------------------------------------------

GPU Gems Chapter 17
- AO 기본 개념 설명
- 오브젝트의 각 포인트에 대해 랜덤하게 생성된 조명(레이)과의 충돌 검사를 통해 음영계산
  (OUTPUT :수정된 노말 벡터)
- 하드웨어가속  : 실질적인 충돌검사대신 조명의 방향에서 생성된 깊이맵을 이용해 차단판단
하드웨어의 발달은 깊이맵을 빠르게 생성할수 있게 해준다(nVidia예제참고)

-> 실시간(게임)에 사용하기에는 느리다

------------------------------------------------------

GPU Gems 2 Chapter 14

- 메쉬의 각 포인트를 디스크로 단순화한 모델
- 차단(충돌) 검출이 단순화 된다
- nVidia 예제참고

-> GPU Gems 에 소개된 방법보다 빠른 수행속도를 보여준다
    구형의 그래픽카드에서는 여전히 느리다

------------------------------------------------------

Screen Space Ambient Occlusion(SSAO)

- 시각좌표에서의 깊이맵을 이용하여 AO과정 단순화
- 깊이맵은 시각좌표에서의 높이값이므로 주변값들과의 비교를 통해 차단상태를 판단한다
- 근사화 기법으로 오류가능성이 있어보이나 나쁘지 않은 결과을 보여주는 듯하다
- 크라이2엔진, 스타크래프트2등 게임에 적용되고 있음

-> 현재 분석중.. 차후 분석및 구현이 끝난후 추가사항 기록할것