아티스트도 할 수 있는 유니티 셰이더 코딩 - 2side 만들기
가르치고 있던 학생한테 긴급하게 카톡으로 질문이 들어왔길래 이래저래 알려 줬는데, 사정의 여의치 않을 수도 있으니 .. 만약 프로그래머 도움을 기대할 수 없거나 급할 때 아티스트가 간단히 쓸 수 있도록 튜터리얼을 만들어 봅니다. 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로 만들 수 있게 되었습니다.