프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 대마왕J

가르치고 있던 학생한테 긴급하게 카톡으로 질문이 들어왔길래 이래저래 알려 줬는데, 사정의 여의치 않을 수도 있으니 .. 만약 프로그래머 도움을 기대할 수 없거나 급할 때 아티스트가 간단히 쓸 수 있도록 튜터리얼을 만들어 봅니다. 2side shader는 아티스트한테 많이 필요한데, 정작 유니티에서 간단하게 설정할 수는 없게 되어 있으니까 말이죠.

 

1. 일단 이런걸 만들었다 칩시다.

 

보통 나무 만들때들 이런 일이 생기죠.

아래 그림을 보면 분명 plane이 하이어라키에서는 6개인데 에디터 화면에는 3개밖에 보이지 않습니다.

나머지 3개는 지금 분명 화면에 있지만, 뒤집혀져 있어서 보이지 않습니다.

이럴때 아티스트들은 외치죠 '2side 쉐이더를 만들어 줘!!'

 

 

2. 일단 shader를 확인해 봅시다.

 

알파를 썼으니, 분명 alpha testing이겠지요. 유니티에서는 cg 문법을 따르기 때문에 cutout 이라는 말을 씁니다. transparent / cutout / diffuse 쉐이더군요. 물론 다른 쉐이더를 쓰실 수도 있습니다.

알파 없이 가는 텍스쳐면 그냥 diffuse , 조명 연산 없을때는 Unlit 계열 텍스쳐를 쓰셨겠지요.

여기에 나오는 쉐이더 이름을 기억합시다.

 

 

 

3. 쉐이더를 다운받읍시다.

 

내장된 쉐이더를 사용했을때는, 쉐이더 이름옆의 edit 버튼을 눌러서 수정하거나 할 수 없습니다. 컴파일 되어 있어서요. 그래서 원본 쉐이더를 받아야 합니다.

내장 쉐이더를 받을 수 있는 곳은 여기입니다.

 

http://unity3d.com/unity/download/archive

 

여기에 본인의 유니티 버전과 맞는 Built-in shader를 받습니다. zip이므로 압축을 풀면 됩니다.

 

4. 원하는 쉐이더를 찾읍시다.

 

위 쉐이더 이름에 부합하는 쉐이더를 찾읍시다.

보통 압축을 풀고 DefaultResourcesExtra 라는 폴더를 찾으면 그 안에 대부분의 내장 쉐이더들이 있습니다.

이름이 약간 다르게 되어 있는 것을 주의해야 합니다.

예를 들어 Normal-Diffuse.shader 라고 하는 파일명은 노말맵을 쓴 Diffuse 쉐이더를 의미하는 것이 아니라,

여기서의 Normal은 그야말로 '보통' 을 의미하므로 '그냥 Diffuse' 를 의미합니다.

노말맵을 쓴 것은 'Bumped' 라는 이름을 씁니다.

 

 

 

 

찾기 어려우면 일일히 열어보는 무식한 방법도 괜찮습니다.

유니티와 같이 깔리는 프로그래밍 툴인 'MonoDevelop'를 실행시킨다음에, 적당한 쉐이더를 하나씩, 실행된 MonoDevelop 로 드래그해서 열어 봅니다.

 

 

 

 

맨 첫 줄에 게임에서 사용되는 쉐이더의 이름이 있으므로, 이 중에서 원하는 쉐이더의 이름을 찾읍시다.

위 경우에는  transparent / cutout / diffuse

를 찾았습니다.

 

찾았습니다. 쉐이더 이름은 AlphaTest - Diffuse 이고, 열어보니 맨 첫줄에 찾던 이름인

"Transparent/Cutout/Diffuse' 가 있었습니다. '/' 마크는 하위 폴더를 만든다는 명령이란걸 알았습니다.

 

 

 

 

5. 새 쉐이더를 만듭시다.

 

이제 쉐이더를 찾았으니 새 쉐이더를 만들어 봅시다. 2side가 되는 놈으로요.

그러려면 일단 기본 쉐이더를 만드는 편이 낫습니다.

 

프로젝트 창에서 오른클릭하고, 아래 그림처럼 새로운 shader를 만듭니다.

 

 

 

새 쉐이더가 만들어 졌습니다. 적당히 이름을 바꿔줍시다.

유니티 규칙과 비슷하게 만든다면 AlphaTest-Diffuse2side 쯤 되겠군요. 뭐 적당히 만드세요.

(저는 AlphaTest-Diffuse2side 로 바꿨습니다)

 

 

 

그리고 새로 만든 그 쉐이더를 더블클릭해서 열어보세요. MonoDevelop가 뜨면서 그 쉐이더가 나올 겁니다.

자동으로 생성된 쉐이더입니다. 내용은 일반 diffuse 쉐이더이죠. 우리는 이게 필요 없습니다. 그러므로 내용을 다 지웁시다.

 

 

 

깨끗해졌습니다.

 

그리고 아까 불러놓은 AlphaTest-Diffuse 쉐이더의 내용을 몽땅 긁어다 붙여 놓습니다.

 

 

 

Transparent/Cutout/Diffuse 라고 되어 있는 부분의 이름을 바꿔야 합니다.

그대로 두면 기존의 Transparent/Cutout/Diffuse 과 충돌납니다.

Transparent/Cutout/Diffuse2side 쯤으로 바꾸죠 .

 

 

 

이대로 저장하고 다시 유니티로 돌아옵시다.

Ctrl+S로 저장하는거 잊지 마세요

 

6. 새 쉐이더를 적용시켜 봅시다.

 

제대로 했다면, Transparent폴더의 Cutout 폴더의 아래에 Diffuse2side라는 쉐이더가 생겼을 겁니다.

이놈을 나무잎에 적용해 봅시다.

 

 

 

아무 변화가 없습니다!!!

만약 분홍색이 나왔다면 복사를 잘못한 것입니다. 다시 깨끗하게 복사해 보세요.

 

우리는 기존의 2side 안되던 쉐이더를 그냥 이름만 바꿔 복사한 것이기 때문에, 지금 상태에서 변화가 있으면 안됩니다. 아무 변화 없이 쉐이더의 이름만 바뀌어야 잘 된 것입니다.

 

그냥 이름만 바꾼 , 똑같은 쉐이더가 생긴 것입니다. 그래야 수정하지요.

 

 

7. 이제 진짜 2side 옵션으로 만들어 봅시다.

 

쉐이더 이름 옆의 Edit... 버튼을 눌러도 되고, MonoDevelop에서 따로 불러도 상관 없습니다. 어쨌건 우리가 새로 만든 쉐이더를 열기만 하면 됩니다.

 

 열면 아래와 같이 나옵니다. 쉐이더 이름을 다시 한 번 확인하세요.

코딩의 대부분의 문제는 오타와 이름 착각에서 나옵니다.

 

 

자, 그럼 이 코드중에 아래 부분에다가 cull off 라고 써 주세요. (;라고 뒤에서 쓰지 않았음을 주의하세요)

CGPROGRAM 이전, Tags 아래부분에다가요. 적당히.

 

그리고 저장하고 유니티로 돌아가 주세요 .

여태까지 한 게 이거 한 줄 써주려고 한 겁니다 ;;;

 

 

 

 

 

짠, 드디어 2side 쉐이더가 되었습니다!

이런식으로 존재하는 어떤 쉐이더이건간에 2side로 만들 수 있게 되었습니다.

 

 

 

 

댓글을 달아 주세요

  1. Favicon of https://gamedevforever.com ozlael 2014.01.20 01:56 신고  댓글주소  수정/삭제  댓글쓰기

    오오 연재글의 출발이신건가요 >ㅈ<

  2. 더케이 2014.05.19 20:08  댓글주소  수정/삭제  댓글쓰기

    애먹고있었는데 좋은정보 감사드려요 ㅎ

  3. 하얀새벽 2014.05.27 19:43  댓글주소  수정/삭제  댓글쓰기

    대마왕님의 강좌내용을 대부분 봤는데.. 저 같은 초보에게 아주 도움이 됩니다.. 감사합니다. 몇가지 질문이 있는데요..
    저는 지금 마야를 배우고 있는 중입니다.. 쉐이딩 개념이 약간 좀 혼란스러운데요..
    쉐이딩에서 버텍스 쉐이딩, 지오메트리쉐이딩 등에 대해서 개념적으로는 대략 이해가 가는데..
    이 외에 volume 쉐이더( 또는 효과), glow, blur 등은 쉐이더의 개념에 포함이 되는 겁니까?
    displacement shader도 매핑자료를 바탕으로 폴리곤에 변화를 주는 것이라 완전히 쉐이더의 개념이라 보기는 좀 어려울 것 같고..
    외곽선 표현에서 2pass를 통한 것도 결국은 또다른 지오메트리를 이용하는 것이라.. 완전한 쉐이더라 보기는 어려울 것 같네요..
    음....그래서..... 질문의 요지는 쉐이딩 언어만으로 volume, glow, blur, displacement 등의 효과를 줄 수 있는지 궁금합니다. 좀 더 구체적으로는 외곽선에 임의의 효과들을 쉐이딩 언어만으로 구현이 가능한지 궁금합니다..

    • Favicon of https://gamedevforever.com 대마왕J 2014.06.15 02:22 신고  댓글주소  수정/삭제

      말씀하신 모든게 셰이더라고 볼 수 있습니다.
      shader라고 하는 것은 결국 그래픽 카드를 통해서 출력되는 모든 픽셀의 함수를 제어하는 것이므로, 모두 같습니다. 지오메트리 변화까지도 셰이더 영역이므로 디스플레이스먼트도 사실 셰이더 영역입니다. (사실 테셀레이션이라고 부르지만요) 볼륨이나 글로우, 블러 같은 것은 post - effects 라고 부르는 후처리 효과입니다만, 이것 역시 사실 shader의 한 영역이라고 불러도 크게 무리가 없습니다.