유니티 원문에는 이기능은 scene을 로드하기만해도 자동으로 수집되기 때문에 shadervariant 파일이 있기만 해도 된다는 식으로 써있지만, 이기능을 어떻게 사용하는지 명확한 설명이 없어서 저처럼 헤메는 일이 없도록 공유해봅니다.
우선 중요한 것은 하나의 scene에 사용되는 모든 material을 모아야 합니다. 여러 scene을 돌아가면서 로드해도 되는데,
문제는 그렇게 하려면 게임을 실행시켜서 모든 scene을 돌아가면서 열어야 하는 번거로움이 있습니다.
수동으로 shader를 기능에 등록만 하면 되지 않을까 생각하지만, 이 기능은 material에서 실제 사용되는 옵션을 저장하는 방식을 가지고 있기 때문에 작업자가 이 옵션을 일일히 넣는다는건 유니티에 shader에 대해 완전히 파악한 사람이 아니고서는 솔직히 어려움이 있습니다. 또한, 여러 shader를 만들었다면...생각만해도.. 끔찍...
그래서 저는 일단 모든 material을 하나의 Scene에 모으는 툴을 프로그램머분에게 요청하고, 그리고 이를 Shadervaiant로 저장하는 방법을 택하였습니다. 다음 영상은 Shadervaiant을 생성하는 과정입니다.
(Clear를 누르고 씬을 저장하고 게임실행하고 Save to asset 한번 눌러주고 하면 수치가 일정하게 나오는거 같습니다.
이순서가 중요한거 같네요.)
간혹 숫자가 자꾸 변경이된다면, 이펙트와 같은 렌덤이 있는 오브젝트가 있을수 있으니 이런 부분은 제거하여야 합니다.
아무리봐도 그다지 차이가 없는데, 풀 코드를 봐서도 그다지 두개의 차이점을 알아낼수가 없었습니다.
다만, 모바일에는 path를 주어서 path을 막아버릴수 있다는거 외에는 그래서 뭐가 정확히 다른가하고 문의한 결과.
Each shader in the UTS2 mobile version omits the FORWRD_DELTA pass. This pass functionally handles the toon processing of the real-time point light, but since the real-time point light itself is a heavy function in the mobile environment, we have omitted this pass to reduce the task of shaders.
라고 답변이 왔습니다.
짧은 번역 능력으로 해설하자면, 모바일은 FORWRD_DELTA pass가 빠져있어서, 리얼타임 포인트라이트가 영향을 받지 않도록 설계가 되어있다고....
해서 다시 코드를 보니.. 빠져있군요.. 아직 갈길이 멀었군요.. 이정도는 눈치챘어야했는데.ㅋ
기본값은 LEqual(이미 그려진 오브젝트와 거리가 같거나 더 가까운 경우에 그립니다. 그보다 먼 경우에는 오브젝트로 숨깁니다)입니다.
Ztest와 Cull 를 이용하면 재미있는 형태를 만들어 낼수 있다.
태그는 위와 같은 구문을 사용합니다. 위 Tag는 전체 셰이더에 영향을 주지만, pass 안에 있으면 선택한 pass에만 영향을 미칩니다.
장면에 물체를 그릴때 마다 객체 정보를 GPU에 전달하고 이 그리는 과정을 "Draw Call"이라고 합니다. 셰이더에 pass가 많을수록 드로우콜이 늘어납니다.(카메라는 가장 먼거리에서부터 가까운 물체를 그립니다.)
Unity에 처리 대기열을 Render Queue라고 합니다.
Render Queue를 수정하는 방법은 두가지 방법이 있습니다.
위처럼 material inspector의 숫자를 변경하여 순서를 정하거나,
아래 셰이더 Tag를 이용하는 방법입니다.
Queue의 순서는 다음과 같습니다.
"Queue"= "배경" 범위는 0 ~ 1499입니다. 기본값은 1000입니다. "Queue"= "지오메트리" 1500 ~ 2399 범위 기본값은 2000입니다. "Queue"= "AlphaTest" 2400 ~ 2699 범위 기본값은 2450입니다. "Queue"= "투명" 2700 ~ 3599 범위 기본값은 3000입니다. "대기열"= "오버레이" 범위는 3600에서 5000까지입니다. 기본값은 4000입니다.
블랜딩 종류각종 블랜딩 옵션 설정 방법
SubShader
{
Tags
{
"RenderType"="Opaque"
"Queue" = "Transparent"
}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha //전통적인 투명
//Blend One OneMinusSrcAlpha // 미리 곱해진 투명
//Blend One One //ADD
//Blend OneMinusDstColor One // SOFT ADD
//Blend DstColor Zero // MULTIPLY
//Blend DstColor SrcColor // 2X MULTIPLY
//Blend SrcColor One //OVERLAY
//Blend OneMinusSrcColor One //SOFT LIGHT
//Blend Zero OneMinusSrcColor //SUBTRACT
BlendOp Add //Default Value
//BlendOP Sub
//BlendOP Max
//BlendOP Min
//BlendOP RevSub
Pass
코드는 위처럼 만들어지게 되고, 그 결과는 아래와 같은 순서로 됩니다.
Blend SrcAlpha OneMinusSrcAlphaBlend One OneMinusSrcAlphaBlend One OneBlend OneMinusDstColor OneBlend DstColor ZeroBlend DstColor SrcColorBlend SrcColor OneBlend OneMinusSrcColor OneBlend Zero OneMinusSrcColorBlend One OneMinusSrcAlpha + BlendOP Sub