프로그래밍/Unity2014. 8. 15. 16:42

출처 : http://jinhomang.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%85%B0%EC%9D%B4%EB%8D%94%EC%9D%98-%EA%B8%B0%EC%B4%88


---


안녕하세요, 유니티 셰이더의 기초 두 번째 시작하겠습니다. 
이전 글의 마지막에 소개된 셰이더 코드부터 다시 한번 살펴보겠습니다.

Shader "Solid White" { 
    SubShader { 
        Pass {  
            Color (1,1,1,1)  
        } 
    } 
}

음, 오브젝트를 흰색으로 렌더링하는 셰이더였군요(사실 틀렸습니다. 이전 글에서는 오브젝트를 빨간색으로 렌더링하는 셰이더였죠;). 이 셰이더를 유니티에서 제공하는 구(sphere)에 적용해보도록 하겠습니다:

 구(sphere)가 그냥 흰색 동그라미가 그려졌습니다. 입체감도 없고 딱히 특별한 감흥도 없으며, 이게 도대체 뭔가 싶습니다. 

 사실 우리가 원하는 건 월드에 존재하는 빛과 물체 표면과 반응하여 뭔가 그럴 듯하게 물체가 보여지는 것입니다.
 그럼 이제부터는 빛과 오브젝트 표면이 반응하여 그려지는 약간은 그럴 듯한 셰이더를 제작해봐야 겠군요. 먼저, 씬(scene) 상에는 이미 directional light 1개가 존재하고 있다고 가정하겠습니다. 
 우리가 셰이더 코드에서 해야 할 것은 딱 두 가지입니다. 
 바로 재질(material)과 라이팅(lighting)를 설정하는 것입니다.

 먼저 물체 표면의 재질(material)을 정의해 보도록 합니다. 
 재질은 다음과 같이 ShaderLab의 Material 구문을 이용하여 정의할 수 있습니다.

Material { 
      Diffuse (1,1,1,1
      Ambient (1,1,1,1
}

 음, 매우 간단합니다. 재질의 Diffuse 색상과 Ambient 색상 모두 흰색으로 지정하라는 구문입니다.

 이제 물체의 재질은 정의했으니, 이제 월드에 존재하는 빛(여기서는 directional light)과 방금 정의한 재질이 '어떻게' 반응할 지를 설정해줘야 합니다. 즉, 조명에 대하여 어떻게 연산할 지를 설정해줘야 한다는 얘기입니다.  
 결론적으로 말하면, 우리는 라이팅 연산을 위해서 '고정 기능 파이프 라인'을 이용할 것입니다. 이는 개발자가 GPU에서 이미 정해져 있는 연산(기능)을 호출하여 오브젝트 렌더링을 수행하는 것을 의미합니다. 그러니까 조명에 대한 연산은 우리가 따로 별도의 신경쓰지 않고, GPU 레벨에서 이미 만들어져 있는 연산을 가져다 쓰기만 하면 되는 것입니다. 
그렇다면 우리가 해야 하는 일이 무엇일까요? 그냥 고정 기능 파이프 라인을 통해 라이팅 연산을 하겠다고 셰이더에 명시하는 작업을 하면 됩니다. 그 외에는 다른 어떤 작업도 필요치 않습니다.
 그냥 ShaderLab의 Lighting (On|Off) 커맨드를 이용하여 라이팅를 켜주면(On) 끝입니다:

 Lighting On

이 코드 한줄만 작성하면 우리는 해당 셰이더에서 고정 기능 파이프라인의 표준 라이팅을 적용한다는 의미입니다. 
최종 정리하면 세이더 코드는:

Shader "VertexLit White" { 
    SubShader { 
        Pass { 
            Material { 
                Diffuse (1,1,1,1
                Ambient (1,1,1,1
            } 
            Lighting On 
        } 
    } 
}

위와 같이 완성할 수 있습니다. 
실제 적용된 화면을 보면 아래와 같습니다.

        
       
 정말 단일 색상으로 물체를 그렸을 때와는 매우 느낌이 다릅니다. 무엇보다도 입체감이 느껴지는게 아주 좋군요. 월드에 있는 directional light 의 방향을 변화시켰을 때, 표면이 다르게 그려지는 걸 보니 잘 동작하는 것 같습니다.

 자, 지금까지 우리는 ShaderLab 만을 이용하여 재질을 정의하고 여기 라이팅을 적용하여 물체를 그리는 셰이더 작성을 완료했습니다. 이것을 다시 말하자면, 방금 우리는 유니티에서 셰이더를 작성하는 방법 중 하나인 Fixed Function Shader를 얼떨결에 작성하게 된 것입니다. 
 Fixed Function Shader 는 고정 기능 파이프라인을 이용하며, 지금과 같이 ShaderLab 만으로 작성이 가능한 것이 특징입니다. 그래서 아주 간단하고 작성이 쉽습니다.  이 Fixed Function Shader에 대해서는 다음 시간에 좀 더 자세히 이야기하는 시간을 가져보도록 하겠습니다.

 감사합니다.


Posted by windship