'UberShader'에 해당되는 글 1건

  1. 2010.03.18 UberShader 를 활용한 게임제작

아래에서 퍼옴
http://eppengine.com/zbxe/programmig/3144

UberShader 을 이용하여 게임을 제작하는 방법에 대한 소개한다.

InHouse 엔진에서 자주 사용되는 기법으로, 간단하면서도 편리한 기법이다.

EPPENGINE 에도 UberShader 를 지원하는 시스템을 갖출 생각이다.

들이는 노력에비해 Material 제작이 아주 간편하고 간략해지며, 변화에 유연하게 대처가 가능해 진다.

우선 UberShader 를 제작하여야 하는데,  모든 기능이 가능한 shader 를 제작한다.

그리고는 각 기능별로 #ifdef 을통해 각 기능을 묶어둔다.

이렇게 제작된 shader 는 define 을 무엇을 정의하느냐에따라 기능이 추가되기도 기능이 감소되기도 한다.

여기까지 글만 보았을때는 특별히 느낌이 없을 수 있다.

예를 들어보자.

특정 게임에 있어서 이미 렌더링 방식자체가 어느정도 정해진 상황이라면

가령... 범프를 사용하는경우 도 있고 범프를 사용하지 않는경우도 있고, 포인트라이트를 사용하는 경우도 있고, 포인트 라이트를 사용하지 않는경우도 있고, 스펙큘러 마스킹을 디퓨즈 텍스쳐의 알파에 있는경우도 있고, 따로 텍스쳐로 만드는 경우.. 등..

각가지 상황이 이미 정해져 있다고 한다면,

위의 상황에따른 case by case 로 material 을 제작한다면 유지보수 해야할 material 수가 많아질 것이며, 각 material 마다의 기능이 조금씩 변경될때마다, 작업은 계속해서 늘어날 것 이다.

eppengine 을 사용하는 특정프로젝트의 경우 오브젝트가 멀어졌을때 specular 사용을 disable 한다던지 그림자 처리를 하지 않는 경우가 있었다.

이러한 경우가 매번 생길때마다, 매번 머터리얼에디트를 통해 새로이 제작하는것은.... 조금 과장하면 구멍뚤린 독에 물붇기????

하지만 이러한 모든 상황이 가능한 shader 을 만들어 두고, 각 기능별로 ifdef 로 묶어둔 상황이라면,

각 케이스에 따라서 define 만 재정의 해주면 간단히 처리된다.

그렇다면.. 예제 소스를 보고 생각해보자.

... shader 코드 내부 ...

float4 diffuse_color = tex2d( diffuse , texcoord );
float spec = calculate_specular();

#ifdef   
DIFFUSE_SPEC_MASK
         float4 spec_color = diffuse_color.a * spec;
#endif
#ifdef    SPECULAR_MAP_MASK
         float4 specular = tex2d( specularSampler, texcoord );
         float4 spec_color = specular * spec;
#endif

float4 final_color = use ( specular_color );
return final_color;


위와 같은 material 을 제작해 두었다면...

실제 클라이언트 코드 쪽에서...


String    strUberShder  =  ubershader_code;
if( use_specular_map == true )
{
            strUberShder = "#define SPECULAR_MAP_MASK" + strUberShder;
}
else
{
            strUberShder = "#define DIFFUSE_SPEC_MASK" + strUberShder;
}
......


그리고 마지막으로 이러한 define 정의는 툴에서 연동하게만 해준다면,  보다 편리하면서도 유연한 material 제작 공정이 가능하게 된다.

물론..... 당연한 이야기 겠지만, 각 게임에 맞는 모든기능을 갖는 shader 는 미리 제작되어져야함은... 두말하면 잔소리!!


Posted by 노을삼킨별
,