1. 문제점

TextMeshPro에서 사용할 마테리얼과 쉐이더가 에디터 상에서는 문제없이 표시되지만 마테리얼과 쉐이더를 전부 에셋 번들화 하고 게임 중 로드 후 사용할 시 기본적으로 제공하는 TextMeshPro/Distance Field쉐이더의 Underlay, Glow 효과가 적용되지 않았다. (Lighting은 사용하지 않았지만 같은 현상이 있을 것으로 예상됨)

TextMeshPro 컴포넌트를 사용 할 시 기본적으로 선택되는 쉐이더 프로퍼티

2. 원인 찾기

한가지 의심스러웠던 부분은 Face속성과 Outline속성은 문제없이 작동한다는 것이다.

뭔가 저 체크박스가 있는 속성은 에셋 번들화 될 시 제대로 듣질 않는 것처럼 보였다.

그래서 스크립트상에서 강제로 저 속성들을 활성화하기 위해 쉐이더의 속성들을 살펴보았다.

TextMeshPro/Distance Field Shader코드

GLOW의 속성을 찾아보았는데 인스펙터에 보이는 각 변수들은 존재하였지만 내가 찾던 저 체크박스를 관리하는 변수는 보이질 않았다. 

TextMeshPro/Distance Field Shader코드

하지만 #pragma shader_feature키워드를 사용해 define처럼 사용하는 코드가 보였다.

바로 유니티 메뉴얼에서 shader_feature라고 검색해보았다.

Difference between shader_feature and multi_compile
#pragma shader_feature is very similar to #pragma multi_compile, the only difference is that unused variants of shader_feature shaders will not be included into game build. So shader_feature makes most sense for keywords that will be set on the materials, while multi_compile for keywords that will be set from code globally.
Additionally, it has a shorthand notation with just one keyword:
#pragma shader_feature FANCY_STUFF
Which is just a shortcut for #pragma shader_feature _ FANCY_STUFF, i.e. it expands into two shader variants (first one without the define; second one with it).

눈에 띌 만한 내용이 있었다. 바로 사용하지 않은 쉐이더 베리언트는 빌드에 포함하지 않는다는 내용.

씬, 쉐이더, 마테리얼 전부 에셋번들화 되어있어 해당 효과를 사용하는지 하지 않는지 판별할 수 없고 포함하지 않은 것처럼 보인다. 아마 저 코드 덕분(?)에 내가 원하는 glow 같은 효과들이 빌드에 포함되지 않은 것 같다. 

 

3. 해결책

가장 좋은 해결책은 저 효과들을 사용한다고 유니티에게 인식시키고 빌드에 포함시켜 게임내에서 쉐이더를 정상적으로 컴파일을 하는 것일 것이다. 하지만 전부 에셋 번들화 되어있는 지금 딱히 방법이 떠오르지 않아 shader_feature 키워드를 전부 벗겨 강제로 빌드에 포함시키는 방법을 사용하기로 했다. 결과적으론 해결.. 하였지만 모든 텍스트에 glow효과가 컴파일될 것이고 결과적으로 성능을 저해할 것이다.

 

4. 여담 

위에서 하나 궁금증으로 남아있던 것은 체크박스는 도대체 뭐란 말인가였다.

일단 인스펙터상에서 보이는 UI들이 기본적인 쉐이더 프로퍼티가 아니니 어디선가 Editor를 수정한 것으로 보인다.

그래서 찾아보았다. 바로 이것.

Package폴더에있는 Shader Editor코드

체크박스의 변수로 보이는 bool변수도 존재하고 ShaderFeature라는 익숙한 타입도 보인다

Package폴더에있는 Shader Editor코드 

아마 위의 코드에서 쉐이더에 키워드를 전달해 define을 하는 흐름인 것 같다.

+ Recent posts