시티즈: 스카이라인/모드/Additive Shader

소개

Additive Shader 모드를 활용하면 Sub-mesh, 프롭 기능을 활용해 부가적인 효과(조명과 같은)를 만들고, 사용자 지정 시간대에 이를 노출시킬 수도 있다.

Additive Shader는 이름 그대로 부가적인 셰이더 기능을 제공하는 것이므로, 조명 효과를 주기 위해 사용되는 것이며, 이를 위해 Bloom효과를 생성한다.

주의사항

빌딩, 서브빌딩, 그리고 건물의 서브 메시를 이용해 Additive Shader용 Mesh에 효과를 주는 경우 렌더링 거리가 매우 짧아지거나, 불특정하게 사라지는 현상이 발생할 수 있다. 따라서 위와 같은 방법은 권장하지 않으며, 대신 Additive Shader 효과를 적용한 프롭을 사용하는 것을 권장한다.

특징

Additive Shader의 경우 시티즈 스카이라인의 다른 Shader들과 다르게 양면으로 텍스처가 표출된다. 하나의 면이 있다면 앞 뒤 모두 볼 수 있는 것이다.

사용방법

Additive Shader 모드의 효과를 적용하기 위해선 Mod Tools의 콘솔 기능을 이용해 스크립트를 실행하여야한다. 시티즈 스카이라인 모드 툴즈의 콘솔 기능은 F7 단축키를 입력하면 사용할 수 있으며, 콘솔 창에 아래 링크 속 스크립트를 붙여넣으면 된다.

https://gist.github.com/ronyx69/97a8efae47d6828f01d7d0ab8189fd73

상단에 링크된 스크립트 중 자신에게 필요한 스크립트를 사용하면 된다.

변수

timeOn / timeOff 변수는 Additive Shader 효과가 적용된 Mesh가 나타나고 사라지는 시간을 지정해준다. 예를 들어 22시에 나타나게 하고 싶다면, var timeOn = 22.0f; 와 같이 입력하면 되는 것이다!

fade 변수는 불투명도입니다. Additive Shader가 적용된 객체는 다른 객체에 가까워질 수록 불투명도가 떨어지는데, 이 변수는 그 값을 설정하는 것이다. 0.5는 불투명도가 크며, 기본값은 1이다.

intensity 변수는 광도를 설정한다. 값이 커질 수록 조명효과의 밝기 정도가 커진다고 생각하면 되며, 이 값이 1을 초과하면 bloom효과가 나타나기 시작할 것이다. 1보다 작으면 어두워지고, 1보다 크면 bloom효과가 나타난다.

만약 Vehicle 에셋을 제작할 때 Sub Mesh로 이 효과를 추가하고자 할 경우 적용할 Sub Mesh를 선택하기 위한 값이 필요하다. 예를 들어 1번 Sub Mesh에 이 효과를 적용하려면 var submesh = 1;을 입력해주어야한다.

Mod Tools의 콘솔을 이용해 스크립트를 새로 입력할 때마다 기존 값이 초기화되고 새로 입력한 값으로 대체되므로, 여러번 값을 바꿔가며 자신에게 맞는 설정을 사용해보자.

예제

Prop에 적용하는 Additive Shader 스크립트.

var timeOn = 22.0f; // 24H time of day at which light turns on var timeOff = 6.0f; // 24H time of day at which light turns off var fade = 20.0f; // fading area around other objects, 0.5 a lot, 1 default, 10+ basically none var intensity = 1.0f; // light multiplier, below 1 darker, 1 default, 1+ may bloom

var shader = Shader.Find("Custom/Particles/Additive (Soft)"); var asset = ToolsModifierControl.toolController.m_editPrefabInfo as PropInfo; if(asset.m_material != null) asset.m_material.shader = shader; asset.m_material.SetFloat("_Intensity", intensity); asset.m_material.SetFloat("_InvFade", fade); asset.m_mesh.name="AdditiveShader "+timeOn.ToString("R")+" "+timeOff.ToString("R")+" "+fade.ToString("R")+" "+intensity.ToString("R"); asset.m_lodMesh = null; asset.m_lodMaterial = null; asset.m_lodMaterialCombined = null; asset.m_lodObject = null;

Mesh와 LOD

Mesh는 기존에 에셋을 만들던 것처럼 원하는대로 만들면 된다. Ronyx69의 와코백화점 조명처럼 좀 더 느낌있게 조명효과를 주고 싶다면 Additive Shader 모드로 어렵지 않게 만들 수 있다.

Additive Shader 효과 적용을 위해 만들어야할 유일한 텍스처는 '_d(디퓨즈 맵)'이다.

조명과 같은 효과를 주는 것이기 때문에 검은색 부분은 당연히 보이지 않는다고 생각하고 만들면 된다. 따라서 투명하게 만들기 위한 _a(알파)맵도 필요하지 않다.

LOD는 아예 필요하지가 않다.

Additive Shader는 LOD에서 작동하지 않으므로 LOD Mesh는 만들어줄 필요가 없다. Additive Shader 모드가 개별적으로 계산하여 렌더링 거리를 책정한다.