블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2856)
Unity3D (896)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (191)
협업 (64)
3DS Max (3)
Game (12)
Utility (142)
Etc (99)
Link (34)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (16)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
DLL을 사용한다면 참고하시라고 몇자 적어봅니다.

 아미 몇번 DLL을 써 보셧다면 다 아시는 내용일겁니다.

 1.  한 프로그램에 쓰인 클래스를 다른 프로그램에서도 같이 써야 할 일이 생겨서, 그냥 소스만 복사해넣고 좀 고쳐서 놓고 쓰니 불편하더군요.. 그래서 DLL 형태로 공유하는 엔진을 만들어서 Static 링크를 시도했읍니다.

  이때 DLL 만들때 제일 먼저할 것은 DLL 생성한 후에  프리컴파일 디파인 에 _AFXEXT 와 _NOWCOMPILE 을 넣어주는 것입니다.  _NOWCOMPLIE 이란 항목은 나중에 컴파일을 위한 옵션입니다.
 
     Project -> Setting ->  C/C++  에서  추가해 줌..

  다음 클래스 이름을 외부에서 호출할 수 있도록

 class AFX_EXT_CLASS  myClass { ...}  로만 선언하고

 헤더파일에 

#if !defined(_NOWCOMPILE)
#if defined(_DEBUG)
    #pragma comment(lib, "..\\myDLL\\debug\\myDLL.lib")
#else
    #pragma comment(lib, "..\\myDLL\\release\\myDLLD.lib")
#endif
#endif

 
 _NOWCOMPLE 옵션은  헤더파일 포함시 LIB가 같이 포함되도록 하는 용도의 플래그 입니다.
 DLL 컴파일시에만 포함되지 않도록 하기 위해서 DLL 프로젝트에만 _NOWCOMPILE를 추가하는 것이죠.

 
 2. 릴리즈 와 디버그 DLL 버전 관리..
 릴리즈와 디버그 버전을 관리하고자 한다면,   제일 먼저 할 일은  .def 파일을 두개로 만들어서 그중 하나에서 디버그용 이름으로 변경해 놓는 것입니다.  제 경우 D를 추가해 놓죠.
 
    Project -> Setting ->  Link  에서 def  이름 지정된 것을 변경해 줍니다.
 
 이 작업이 빠지면, 디버그 와 릴리즈 버전 이름이 같아서 혼동이 생기게 됩니다.


 3. 버전에 따른 리소스를 다르게?

  버전에 따라서 리소스의 버전을 다르게 만들고 싶어질 경우가 있읍니다.
  좀 귀찮아서 써 봤는데.. 
  이경우    Project -> Setting ->  Resource 에서  프리컴파일 디파인을 지정해 줄 수 있읍니다.
  그러면 RC 파일을 편집해서  조건을 지정할 수 있지만, 여기에 가장 큰 문제는
  리소스 에디터에서 변경을 하게되면 조건 걸린 부분이 날라갑니다.
 결국 별도 파일로 만들어서 #include 시켜서 써야 했죠.
 제경우 bmp 이미지를 몇개를 버전에 따라서 다르게 보이도록 하기 위해서 설정한 것입니다.


 4.  다이나믹 DLL  사용

 먼저 DLL을 만들고, DLL에서 사용하는 함수를 호출 할 수 있도록 선언합니다.
 
extern "C" __declspec( dllexport ) void  InitPage(CString arg1,CString arg2)
{
   CMyDlg dlg;
   dlg.DoModal();
}

  CMyDlg dlg 라는 것이 DLL 내부에 만들어진 다이알로그 입니다.
 

 DLL 의 InitPage 를 호출하는 부분

void CallDll()
{
HINSTANCE hInst,oInst;
#ifdef _DEBUG
    hInst=AfxLoadLibrary("myDLLD.dll"); // 디버그 버전
#else
    hInst=AfxLoadLibrary("myDLL.dll"); //릴리즈 버전
#endif
    if (!hInst)
    {
        AfxMessageBox("DLL Load 에러!");
        return;
    }
    typedef void ( * INITPAGE)(CString,CString);
    INITPAGE func;
        func=(INITPAGE)GetProcAddress(hInst,"InitPage");
    if (func)
    {
        oInst=AfxGetResourceHandle();
        AfxSetResourceHandle(hInst);
        func("테스트","테스트1");
        AfxSetResourceHandle(oInst);
    }
    AfxFreeLibrary(hInst);
 
}

 이렇게 사용하면 됩니다.
 여기서 리소스 핸드를 바꿔주고 복구하는 것이죠
 여기서 중요한 포인트는     typedef void ( * INITPAGE)(CString,CString); 입니다.
 DLL 과 함수 선언이 동일해야 합니다. 저의 실수는 처음에 만들때     typedef bool  ( * INITPAGE)(CString,CString); 로 해 놓고 컴파일하니 이상없이 동작 잘 하더군요,  DEBUG 버전에서 릴리즈 버전으로 바꾸어서 테스트 하니  스택에 오류가 생기더군요.. 무엇이 원인인가.. DLL 함수 선언이 문제인가 하고 이것 저것 고민하면서 테스트 했는데,  결론은 DLL 의 평션에서는  void 였는데,  콜할때 선언은 BOOL 로 해서 ,   릴리즈 버전에서 스택에서 리턴값을 클리어하느라 에러가 났던 것입니다.
  반듯이  DLL 과 사용하는 함수의 선언은 리턴값까지 일치 시켜야 합니다.  파라미터에 신경쓰다가 실수한 부분입니다.

 
 5. 다이나믹 DLL 의 해제 시점..

  DLL의 함수에서 메모리 할당을 받았다면,  DLL 의 해제 시점(AfxFreeLibrary 호출 시점)은   메모리 해제한 이후에 해야 합니다.
  무슨 소리냐면, DLL 함수에 구조체를 보내서, DLL에서  구조체의 데이타를 Free 시키고, 새로 할당해서 데이타를 채워서 리턴시키는데,  이것을 Free 하는 시점에서 계속  힙이 깨졌다는 오류가 나오더군요.
 원인 파악을 하기 위해서 6시간정도 고생을 했는데, 결국 DLL 해제 시점을 옮김으로서 해결되더군요.
 만약 DLL 에서 뭔가를 가져왔다면,  반납하기 전에는 DLL을 해제하지 마세요..
 시스템 크래시와 부딪힐 수 있읍니다.


 

 이상입니다.
 과연 몇분에게나 도움이 될런지.....

ps:
 쓰레드간 통신에서  SendMessage 를 가지고 동기화를 하게 되는 경우,  데드락 걸릴 수 있는 여지가 있읍니다.
 그걸 해결하는 방법은 SendMessageTimeout 이란 평션을 사용하면 어느정도 해결됩니다.
 단 메세지 전송되는 핸들이 서로다른 쓰레드일 경우에만 효과가 있다고 하더군요.
 여기 Q/A 에 있는 정보 입니다.


출처 : 
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=4722&ref=1602
반응형
Posted by blueasa
, |

미들웨어 정리

Tip & Tech / 2011. 4. 13. 11:46

[웹사이트][미들웨어] / [제작사] / [설명]


[그래픽]

Speedtree Solution /  Interactive Data Visualization / 나무 생성 
http://www.speedtree.com/

Enlighten / Geomerics / Global illumination, radiosity, ray tracing, soft shadows and many lighting/shading/shadowing optimized technniques middleware 
http://www.geomerics.com/

ProFX / Allegorithmic /Procudually textures middleware
http://www.profxengine.com

Digimask SDK / Digimask / Digital facial model making system middleware
http://www.digimask.com/

 

 

[물리]

Havok Physics SDK / Havok / 기존 플랫폼과 차세대 플랫폼 기반으로 실시간 물리 현상 구현을 위한 SDK
http://havok.com

AGEIA PhysX SDK / AGEIA Technologies/ 물리 모델링 SDK
httP://www.ageia.com

 

[관리]

Umbra / Umbra Software / Scene graph optimized middleware
dPVS /  Umbra Software / Scene graph, optimized middleware
sPVS / Umbra Software / Scene graph, optimized middleware
http://www.umbra.fi/


[비디오]

Bink  / RAD Game Tools / in-game video and movies middleware
http://www.radgametools.com

 

[특수효과]

Havok FX SDk / Havok / 특수효과 미들웨어 라이브러리
http://havok.com


[사운드]

FMOD / Firelight Technologies / 음악 & 사운드효과 시스템
http://www.fmod.org

OpenAL / Creative Labs's/ Audio System
http://www.openal.org

Ogg Vorbis / Xiph / Audio System
http://www.vorbis.com

Miles / RAD Game Tools / 3D 사운드를 지원하는 사운드 시스템
http://www.radgametools.com

 


[애니메이션]

EmotionFX / Mystic Game Development / 게임 개발자용 캐릭터 애니메이션 미들웨어
http://www.emotionfx.com

Havok Animation SDK / Havok / 기존 플랫폼과 차세대 플랫폼 기반 실시간 렌더링을 위한 빠르고 유연한 애니메이션 SDK 
http://havok.com

Granny / RAD Games Tools / 캐릭터 렌더링 엔진
http://www.radgametools.com

 


[네트워크]

Rendez-Vous / QUAZAL / 네트워크 엔진

Spark/  QUAZAL / 네트워크 엔진 
http://www.quazal.com

 


[인공지능]

Kynapse A.I. / Kynogon SA / 인공지능 middleware
http://www.kynogon.com

AI Implant / Engenuity Technologies / 인공지능 middleware
http://www.ai-implant.com

 
[출처] 미들웨어 정리|작성자 FlowEJ

반응형
Posted by blueasa
, |

NDC10_장용석_fmod를 이용한 사운드 프로그래밍  발표자료 / NDC 

2010/06/22 16:06

복사http://ndc.nexon.com/150088648457

반응형
Posted by blueasa
, |

출처 : http://cafe.naver.com/devrookie/5119
반응형
Posted by blueasa
, |

1. pair란?

  STL의 기본적인 유틸 클래스이다. 두가지의 값을 하나인것 마냥 사용할수 있도록 해주는 클래스이다.

 

2. pair 소스

      template<class _Ty1, class _Ty2>

      struct pair
      { 

             // store a pair of values
             typedef pair<_Ty1, _Ty2> _Myt;
             typedef _Ty1 first_type;
             typedef _Ty2 second_type;

            

             // 기본 생성자

             pair()  : first(_Ty1()), second(_Ty2())
             { 
             }

 

             // 복사 생성자

             pair(const _Ty1& _Val1, const _Ty2& _Val2) : first(_Val1), second(_Val2)
             { 

             }

             

             // 암시적 형변환시 사용되는 생성자      

             template<class _Other1,  class _Other2>
             pair(const pair<_Other1, _Other2>& _Right)  : first(_Right.first), second(_Right.second)
             { 

             }

 

            void swap(_Myt& _Right)
            {

                    if (this != &_Right)
                   { 

                         std::swap(first, _Right.first);
                         std::swap(second, _Right.second);
                   }
             }

             _Ty1 first; // the first stored value
             _Ty2 second; // the second stored value
       };

 

  두개의 탬플릿을 이용해서 값을 전달한다. 그 값이 명시적 형변환이냐 암시적 형변환이냐에 따라서 생성자를 호출하고 first와 second를 초기화 시켜준다. first와 second에 값을 넣어 주기 때문에 두개의 값을 하나로 사용할수 있다고 말해주는 것 같다.

 

3. 어디서? 어떻게? 사용을 할까?

  이제 막 STL 책에서 가장 앞쪽 부분만을 보고서 이렇게 글을 쓰다 보니 아주 조그만한 부분에서 사용되는것밖에 모르겠다. 일반적으로 우리는 vector, map, multimap등을 자주 사용하게 된다. 이런 부분에서 사용을 하면 매우 유용하다. 특히 map과 multimap의 경우에는 두개의 key와 value를 사용하게 되는데 이때 make_pair를 사용하면 매우 유용하다. make_pair는 아래와 같다.

 

                                    templateclass T1, class T2 >

                             namespace std {

                                    pair<T1, T2> make_pair( const T1& x, const T2& y )

                                    {

                                              return std::pair< T1, T2 >(x, y);

                                     }

                             }

 

  보면 알겠지만 pair<T1, T2>(x, y)를 리턴하기때문에 두개의 값을 하나로 쓰는 거라고 할수 있다. 그렇기 때문에 map과 multimap등에서 사용이 가능하다. 아래는 make_map을 사용한 예제 이다.

 

                                  using namespace std;

                            int main()

                            {

                                     typedef multimap< int, string > intStringMap;

                                     intStringMap coll;

 

                                     coll.insert( make_pair( 1"this" ) );

                                     coll.insert( make_pair( 2"that" ) );

                                     coll.insert( make_pair( 3"she" ) );

                                     coll.insert( make_pair( 4"you" ) );

 

                                     intStringMap::iterator pos;

                                     for( pos = coll.begin(); pos != coll.end(); pos++ )

                                     {

                                              printf("key : %d, value : %s\n", pos.first, pos.second.c_str() );

                                      }

 

                                      return 0;

                             }

 

  뭐 대충 이런 식으로 사용을 하면 유용하게 사용할수 있을 것 같다. 물론 이렇게 사요하지 않아도 된다. 위 소스는 multimap에 값을 넣고 반복자를 이용해서 값을 출력한 예제이다. 매우 간단하니 그냥 훓어보기만 하면 될것같다.

  pair 같은 경우는 STL에서 유용하게 사용되는 유틸 클래스이다. 이런 사용은 일반적인 경우이고 내부적으로 더욱 많은 부분에서 사용되고 있다고 한다.

 

4. 결론

  결국 처음에 말했던것과 같이 내가 이해한 pair는 두가지의 서로 다른 값을 하나와 같이 사용할수 있는 값의 집합이라고 보면은 매우 편한것 같다. 오늘 책을 잠깐 봤는데 읽으면서 나는 이렇게 이해했다. 책에서도 x, y값을 담는 POINT 구조체와 비슷한 느낌인것같다. 다른 점이라고한다면 template을 사용해서 서로 다른 타입의 변수를 대입할수 있다는 점인것 같다.


[출처]
 [STL] 유틸 클래스 pair|작성자 sangtakeg

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

쉐이더

Gamebryo/Shader / 2011. 4. 4. 06:41

쉐이더파일 - > HLSL
 - NSB : 바이너리,
 - NSF : 아스키
HLSL == NSF => NSB

NIF에 쉐이더 코드는 들어가지 않음.. 따로 관리 / 로딩해야함.. ㅡㅡa 약간 불편한 구조다..

DLL구조때문에 소스가 좀 이상타~~ 좀 더 쉽게 해주지.. 쩝... 폴더경로 읽으면 됨...
NiShaderFactory::RegisterErrorCallback(ShaderCallback_Errors);
NiShaderFactory::RegisterRunParserCallback(ShaderCallback_RunParser);
NiShaderFactory::RegisterClassCreationCallback(ShaderCallback_LibraryClassCreate);

맥스에서 쉐이더 이름을 설정해 줘야 한다...~~~
쉐이더 이름과 파일이름이 매칭되는듯 하다..

사용자 삽입 이미지
사용자 삽입 이미지

노드 이름 검색 : NiNode->GetObjectByName()
노드 연결 : NiNode->AttachChild


 출처 : 
http://hopkh.nayana.kr/tc/hopkh/246?category=20
반응형

'Gamebryo > Shader' 카테고리의 다른 글

알파 텍스쳐 블렌딩 공식  (0) 2011.07.22
[펌] Soft Particle (Depth bias blend)  (0) 2011.06.15
HDR  (0) 2011.04.04
겜브리오 쉐이더 제작시 주의사항  (0) 2011.04.04
Using Fx Shader In GameBryo  (0) 2011.03.17
Posted by blueasa
, |

HDR

Gamebryo/Shader / 2011. 4. 4. 06:15

여기에서는 HDR의 간략한 개념과 PostEffect를 구현하는 방법에 대해서 이야기합니다.

 

HDR의 구현에 대해서는 자세하게 적지 않습니다.

 

HDR

 

Hight Dinamic Range....

 

빛의 밝기를 R8G8B8A8로 표현하려고 하다보면.. 8비트 컬러값으로 부족하다.

 

밝기의 단계가..256단계라니... 쉣!

 

그래서 DX9로 넘어오면서 R16G16B16A16 이라는 엄청난 포맷을 내놓았다고...

 

이제는 16비트 컬러값으로 밝기를 표현할 수 있으니.. 실로 엄청난 발전이라 할 수 있겠다.

 

HDR은 위와 같은 발전된 파일 포맷을 이용하여, 빛을 좀 더 풍부하게.. 그리고 좀 더 현실적으로 표현하는 방법이라고 정의 하는것이 맞을 것 같다.

 

HDR의 구현은 간단하다.

 

화면 전체의 평균 밝기를 계산하고

 

밝은 부분은 따로 때내서( 이때, 평균 밝기를 사용 ).... 가우시안 블러를 먹인 후, 원본 이미지와 더해주면 된다.

 

( 역시, 말은 쉽다 ㅎㅎ )

 

In Gamebryo

 

알아야 하는 것들..

 

- Shader 사용 방법

- Mesh에 Shader 적용하는 방법

- NiScreenFillingRenderViewImpl 의 소개

- Shader의 변수 설정 : float, texture

- Render Target의 관리

 

Shader 사용 방법 

간단하다... NiSample을 사용한 Shader 등록은 정말 간단하다.

 

혹시, NiSample을 이용하지 않았다면.. ShaderLib 샘플에서 제시한 방법을 사용하도록 한다.

 

bool HDRSample::RegisterShaderParsers()
{
    m_kParserLibraries.Add(&NSFParserLib_RunShaderParser);
    return true;
}

bool HDRSample::RegisterShaderLibraries()
{
    m_kShaderLibraries.Add(&NiD3DXEffectShaderLib_LoadShaderLibrary);
    m_kShaderLibraries.Add(&NSBShaderLib_LoadShaderLibrary);
    return true;
}

 

Mesh에 Shader 적용하는 방법

Gamebryo 2.5에서는 Shader가 Material로 통합되어있다. 정확하게 몇 버전 부터 그래왔는 지는 잘 모르겠다.

 

다음은 우리가 .fx 파일에 정의해둔 Material을 받아오는 방법이다.

NiMaterial* pDownScale4x4Material = NiSingleShaderMaterial::Create("HDRRenderStep_DownScale4x4");

 

다음은 RenderObject( 일반적으로 NiMesh )에 Material을 적용하는 방법이다.

kRenderObject.ApplyAndSetActiveMaterial(pDownScale4x4Material);

 

NiScreenFillingRenderViewImpl

몇 일전에 Shader를 Post Effect를 적용하기 위해서...

 

2DRenderView를 만드들고 RenderView을 가득채울 수 있는 NiMeshScreenElements를 만든적이 있다.

 

아~!!!! 삽질이여...

 

NiScreenFillingRenderViewImpl 는 PostEffect에서 딱 사용하기 좋은

 

내가 위에서 했던 삽질을 한방에 해결해주는 RenderView이다.

 

Shader의 변수 설정 : float, texture

 

변수 설정

 

NiShaderFactory::UpdateGlobalShaderConstant( "gfBrightPassThreshold", sizeof(float), &f);

 

float, matrix, color, float array... 등을 넘기는 함수는 형태가 동일하다 ^^;

 

텍스쳐 설정

if (pkShaderMap0)
    {
        NiTexturingProperty::ShaderMap* pkPSVSShaderMap0 
            = NiNew NiTexturingProperty::ShaderMap(
            pkShaderMap0, 0, NiTexturingProperty::CLAMP_S_CLAMP_T,
            NiTexturingProperty::FILTER_NEAREST, 0);

        NIASSERT(pkPSVSShaderMap0);
        spPSVSQuadTex->SetShaderMap(0, pkPSVSShaderMap0);
    }

 

그냥 TexturingProperty에 SetShaderMap이라는 함수를 호출해 주기만 하면.. Shader로 Texture가 넘어가도록 되어있다.

 

SetShaderMap 함수의 첫 번째 인자가 Shader에 정의해둔 Shader Index와 일치해야한다.

 

다음은 HDRRenderStep.fx 의 내용중 일부이다.

texture Shader0Tex

    bool hidden = true;
    string NTM = "shader";
    int NTMIndex = 0;
>;

 

Render Target 관리

 

 Render Step의 Render Target 설정

 

m_spFrame->GetRenderStepByName(m_kMainRenderStepName)->
        SetOutputRenderTargetGroup(m_spHDREffect->GetInputRenderTargetGroup());

m_spHDREffect->SetOutputRenderTargetGroup(
        m_spRenderer->GetDefaultRenderTargetGroup());

 

// MainRenderStep의 출력을 HDREffect의 입력으로 넣어주고..

// HDREffectStep 의 출력은 DefaultRenderTargetGroup 로 맞춰준다.

 

GetInputRenderTargetGroup은 원래는 제공하지 않는 함수다..

멤버 변수로 화면 크기와 같은 Texture와 그의 RenderTargetGroup을 만들어 놓은 것이다.

 

 

 

 

각 HDR 단계도 위와 같이 RenderTarget을 공유하도록 한다.

 

타겟으로 사용될 하나의 Texture를 만들고, 여기서 RenderTarget을 만들어 내낸다.

 

m_spTex = NiRenderedTexture::Create(uiWidth, uiHeight, m_pkD3DRenderer, kPrefs );

spRenderTG = NiRenderTargetGroup::Create( kBuffer.m_spTex->GetBuffer(), m_pkD3DRenderer, true, true) );

 

m_spTex를 누군가의 입력으로 사용하는 방법은 간단하다...

 

spMesh 에 Base Texture 혹은 Shader Texture로 설정해주기만하면 된다. ( Shader 변수 설정을 보면 된다 )

 

샘플에서는 HDR 각 단계가 RenderClick을 상속 받아서 만들어졌다.

 

아직도 RenderClick으로 구분하는 것과... RenderView에 RenderObject를 차례대로 넣어주는 것의 차이를 정확하게는 이해할 수 없지만.. 뭔가 어렴풋하게는 좋은것 같다.

 

 

위에서 한 번 언급한적 있지만.. RenderTargetGroup은 DefaultRenderTargetGroup 이외에는 존재하지 않는다.

 

우리가 사용할 RenderTargetGroup을 만들어서 RenderStep과 RenderClick 사이에 입력과 출력으로 잘 끼워넣어야한다.


[출처]
 [Sample] HDR |작성자 프라이드

반응형

'Gamebryo > Shader' 카테고리의 다른 글

알파 텍스쳐 블렌딩 공식  (0) 2011.07.22
[펌] Soft Particle (Depth bias blend)  (0) 2011.06.15
쉐이더  (0) 2011.04.04
겜브리오 쉐이더 제작시 주의사항  (0) 2011.04.04
Using Fx Shader In GameBryo  (0) 2011.03.17
Posted by blueasa
, |
1. NSF 를 건드리면 반드시 NSB 를 삭제한 후 Asset Viewer나 MAX를 실행시켜, NSB가 생성되는지 확인할 것. 
생성이 안되면 엔진에서 NSF를 읽지 못한 것이다. 

2. NSF는 hlsl이 아니라 스크립트다. 때문에 띄어쓰기나 Tab에 매우 민감하다 (그런 것 같다) 
이 부분 때문에 수많은 삽질을 한 관계로, NSF를 제작시 Tab과 스페이스바에 주의하라. 

3. NSF를 건드리면 모든 뷰어를 종료하고 NSB가 생성되는지 확인해야 하지만, 
hlsl을 건드렸을때에는 맥스가 실행중이라고 해도 바로 확인할 수 있다. 

4. 반드시 한 줄을 추가하고 실행되는지 계속 점검하라. 
한 시간 동안 짜놓은 코드가 작동이 안될 때에는 찾을 방법이 없다. 

5.  텍스쳐 UV 에니메이션의 키 값을 받아오는 명령은 
CM_Defined     TexTransformBase     MatrixTexbase     4
이다. TexTransform의 계열에는 여러 종류가 있고, 커스텀 Attribute도 이런 식으로 넘길 수 있을 듯 하다. 

6. Constantmap 에서 순서는 다소 애매한 느낌이 있다. 

CM_Defined     WORLDVIEWPROJ     view_proj_matrix     0


에서 view_proj_matrix 는 레지스터를 나타낸다고 생각하면 좋다.그리고 레지스터를 자동으로 잡아준다고 생각하면 좋다. 
그리고 그 이후의 숫자는 Extra Data로, 기본적으로 0을 쓰면 된다. 
물론 텍스쳐와 같이 여러 장을 쓸 때는 인덱스 넘버로 사용해서, 0부터 1,2,3 순서로 쓰면 된다. 
그리고 같은 방식으로 이런 방식이 가능하다. 

CM_Defined     WORLDVIEWPROJ     0     0
 

이것은 이름으로 받지 않는 형식이라, 앞의 숫자는 인덱스 넘버를 위한 엑스트라 데이터가 아니라 레지스터가 된다. 즉 사용하는 레지스터만큼 넣어주면 된다. 
그 이후에 숫자가 더 들어갈 수 있는데, 이것은 초기값이다. 

CM_Defined     MaterialEmissive    0     0     0


즉 위와 같은 형식이 가능하다는 ..

CM_Difine 된 것은 저렇게 구분해서 사용하면 되고, User Custom Attribute 를 사용할 때에는 이후 숫자가 레지스터를 수동으로 표시해주는 넘버부터 나오게 된다 (고 한다) 


출처 :  
http://chulin28ho.egloos.com/5035307
반응형

'Gamebryo > Shader' 카테고리의 다른 글

알파 텍스쳐 블렌딩 공식  (0) 2011.07.22
[펌] Soft Particle (Depth bias blend)  (0) 2011.06.15
쉐이더  (0) 2011.04.04
HDR  (0) 2011.04.04
Using Fx Shader In GameBryo  (0) 2011.03.17
Posted by blueasa
, |

[M/V] Sunshine Girl

Etc / 2011. 3. 31. 16:54
반응형
Posted by blueasa
, |