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

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

네덜란드인가... 그 지역의 배경으로 하는 이야기중.. 댐을 막는 이야기가 있다.. 작은 구멍을 막지 않고 방치하여 홍수가 났다는 그런이야기인데....

큰 비로 홍수가 나는것처럼 한순간에 마음으로 들어올수도있지만 작은 구멍을 그냥 방치해서 마음이 흘러가는데로 나두다 어느순간에는 막지못하는 지경에 이르러 지칠때까지 막다가 결국..

 

<-선덕여왕 미실의 대사중>

목표를 위해서 사람을 이용하는것보다 사람이 목표가 되는것이 위험하다했다. 맞는말인것 같다.... 그렇지만 어쩔수없나보다.

 

 

 

GameBryo 에서 Fx Shader 를 사용하려고 하면 편리하게 제공된 클래스가 있다. Full Demo에서 사용되어지는 ShaderHelper 라는 클래스인데.. 간단히 어플리케이션 시작시 초기화와 끝날시 해제를 하여준다면 ShaderHelper에서 사용자가 설정한 디렉토리에 쉐이더파일(Fx.등등)에 쉐이더를 모아둔다면 로딩과 해제를 하여준다..

 

처음 Fx파일이 로딩될시 GameBryo Library에 보면 이 쉐이더파일을 Parsr하는  NiD3DXEffectParser라는 클래스가 있다. 이 파서에 보면 GameBryo가 어떤식으로 Fx Shader에 Application에서 Dx를 통해 제공하는 매트릭스(world, view, worldview) 등을 넘기는지를 알수있는데 그것이 세만틱과 각종 주석들이다..(물론 이건 나도 처음부터 궁금했었지만 최근에야 알게되었다, Help파일에 있드라.. 미리좀 자세히 바뒀으면..) 주석에는 desc, description, uihelp, hidden, uiwidget, none name, target, obejct, objectindex... 기타등등이 있고 Semantic을 파서하는 내용을 보면.. 세만틱 내용에 it, trans, transpose, inv, i, inverse, model, space, 기타등등의 이름을 찾아서 있으면 그것을 넘기는 식이다.. 예를들어..

float4x4 viewInv : ViewInverse < string UIType = "None"; >;  
float4x4 viewInv : InvView < string UIType = "None"; >; 

 

위 코드가 있다면 이것을 파서하여 해당단어들의 존재유무로 매트릭스를 넘긴다.위 두개코드에서 넘겨받는 viewInv는 동일하다. 세만틱에 View라는것이 있고 Inverse나 Inv가 존재하면 그걸을 InverseView로 인식하는 식이다. 다른것도 마찬가지이고 SKINBONEMATRIX3 라는 세만틱이 존재하고 그것을 이용한다면 메쉬를 Hardware skinning으로 처리하여 스킨계산을 application에서 하지 않는다.

 

맥스에서 쉐이더로 설정한 값들은 메쉬에 쉐이더 주석의 이름으로 ExtraData로 넘겨져서 들어가져 있어 셋팅을 변화하고자할때는 이 ExtraData를 찾아서 값들을 세팅하여 주면되고 맵등은 메쉬의 TexturingProperty에 shadermap 을 변경하여 주면된다.

 

그 밖에 특정 쉐이더를 직접 어떠한 노드구조 하위에 입히고자 할때에는 아래처럼 하면 된다.

void FindGeomSetMaterial(NiAVObject* pkAVObject, bool bMarkedParent, int nID)
{
  if (NiIsKindOf(NiGeometry, pkAVObject))
  {
  NiMaterial* pkMaterial;
  pkMaterial = NiSingleShaderMaterial::Create("GB_NomalOutLine_TEST");
  //if (bMarkedParent || strstr(pkAVObject->GetName(), "PlanarOccluder"))
   {
   NiGeometry* pkGeom = (NiGeometry*)pkAVObject;
   pkGeom->ApplyAndSetActiveMaterial(pkMaterial);

   const NiMaterial *pkMat = pkGeom->GetActiveMaterial();
   }
  }
  else if (NiIsKindOf(NiNode, pkAVObject))
  {
       // bool bMarked = false;
       // if (strstr(pkAVObject->GetName(), "Occluder"))   // 해당노드의 이름에 Occluder가 들어간 놈들만은. 머 이런식으로..
         bool   bMarked = true;

        NiNode* pkNode = (NiNode*)pkAVObject;

        unsigned int uiChildren = pkNode->GetArrayCount();
        for (unsigned int ui = 0; ui < uiChildren; ui++)
        {
            NiAVObject* pkChild = pkNode->GetAt(ui);
            if (pkChild)
                FindGeomSetMaterial(pkChild, bMarked, nID);
        }
    }
}

[출처]
 < Tips >: Using Fx Shader In GameBryo |작성자 메딥


반응형

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

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