본문으로 바로가기
반응형

내 맘대로 엔진 제작기 - 10(셰이더 Shader)
dEngine: A iOS 3D renderer source code

https://libsora.so/posts/uber-shader/



Uber Shader


 #cg #shader





void main()

{
    vec4 color = vec4(1, 1, 1, 1);

    #if USE_TEXTURE == 1
   

       gl_FragColor = texture2D(tex, texcoord) * color;
   

    #else

    gl_FragColor = color;

    #endif
}




USE_TEXTURE 1

input

#define USE_TEXTURE 1
// input original source
// ...

output

void main()
{
    vec4 color = vec4(1, 1, 1, 1);
    gl_FragColor = texture2D(tex, texcoord) * color;
}



USE_TEXTURE 0

input

#define USE_TEXTURE 0

// input original source
// ...

output

void main()
{
    vec4 color = vec4(1, 1, 1, 1);
    gl_FragColor = color;
}



대체 이걸 어떻게/언제 쓰는가?

내가 간단하게 사용한 방식은 다음과 같다

    다음의 속성을 전부 때려박은 광원 모델을 계산하는 쉐이터를 만든다

        Ambient Color
        Diffuse Color
        Diffuse Map
        Specular Color
        Specular Map


    각각의 속성에 따른 빛 계산 부분을 블럭으로 묶고 위와 같이 ifdef…endif로 잡아준다
    어떤 라이팅 모델이 필요할지에 따라서 코드 맨 위에 define을 걸어준다. 만약 Ambient, DiffuseColor, SpecularColor만 사용하고 싶으면 다음과 같은 문자열과 쉐이더 코드를 합쳐서 쉐이더 코드로 사용한다


#define USE_AMBIENT_COLOR 1
#define USE_DIFFUSE_COLOR 1
#define USE_DIFFUSE_MAP 0
#define USE_SPECULAR_COLOR 1
#define USE_SPECULAR_MAP 0


// Real Uber-Shader Code
//....

기타 광원 효과도 나중에 블럭으로 만들어서 집어넣음으로써 확장이 가능하다.


장점

핵심 라이팅 모델은 쉐이더 코드 하나만 유지보수함으로써 끝난다. 쉐이더를 많이 짤 일이 없는 경우는 Uber shader 몇개로 어지간한건 다 떄울수 있겟더라. dEngine의 경우가 크고 아름다운 UberShader와 몇개의 간단한 쉐이더로 필요한 쉐이더를 전부 때웠다.



단점

전처리기 명령이 떡칠되다보니까 쉐이더 코드 유지보수하기가 어렵다.


반응형