Shader "VRCBoard/VRCBoardAtlasShader" { Properties { // _MainTex _MainTexAtlas("Albedo", 2D) = "white" {} [HideInInspector] _MainTexAtlasSize("Atlas Size", int) = 1 [HideInInspector] _MainTexAtlasIndex("Atlas Position", int) = 0 [HideInInspector] _MainTexColor("Color", Color) = (1,1,1,1) // _EmissionMap _EmissionMapAtlas("Emission", 2D) = "black" {} [HideInInspector] _EmissionMapAtlasSize("Emission Atlas Size", int) = 1 [HideInInspector] _EmissionMapAtlasIndex("Emission Atlas Position", int) = 0 [HideInInspector] _EmissionColor("Emission Color", Color) = (1,1,1,1) // _NormalMap _NormalMapAtlas("Normal", 2D) = "bump" {} [HideInInspector] _NormalMapAtlasSize("Normal Atlas Size", int) = 1 [HideInInspector] _NormalMapAtlasIndex("Normal Atlas Position", int) = 0 [HideInInspector] _NormalMapScale("Normal Scale", float) = 1 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM #pragma surface surf Standard fullforwardshadows #pragma target 3.0 sampler2D _MainTexAtlas; sampler2D _EmissionMapAtlas; sampler2D _NormalMapAtlas; uint _MainTexAtlasSize; uint _MainTexAtlasIndex; float4 _MainTexColor; uint _EmissionMapAtlasSize; uint _EmissionMapAtlasIndex; float4 _EmissionColor; uint _NormalMapAtlasSize; uint _NormalMapAtlasIndex; float _NormalMapScale; struct Input { float2 uv_MainTexAtlas; float2 uv_EmissionMapAtlas; float2 uv_NormalMapAtlas; }; // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. // #pragma instancing_options assumeuniformscaling UNITY_INSTANCING_BUFFER_START(Props) UNITY_INSTANCING_BUFFER_END(Props) void surf (Input IN, inout SurfaceOutputStandard o) { _MainTexAtlasIndex = _MainTexAtlasIndex+_MainTexAtlasSize; _EmissionMapAtlasIndex = _EmissionMapAtlasIndex+_EmissionMapAtlasSize; _NormalMapAtlasIndex = _NormalMapAtlasIndex+_NormalMapAtlasSize; float2 MainTexAtlasUV = float2( (float(_MainTexAtlasIndex % _MainTexAtlasSize) + IN.uv_MainTexAtlas.x) / _MainTexAtlasSize, 1.0 - (float(_MainTexAtlasIndex / _MainTexAtlasSize) - IN.uv_MainTexAtlas.y) / _MainTexAtlasSize ); float2 EmissionMapAtlasUV = float2( (float(_EmissionMapAtlasIndex % _EmissionMapAtlasSize) + IN.uv_EmissionMapAtlas.x) / _EmissionMapAtlasSize, 1.0 - (float(_EmissionMapAtlasIndex / _EmissionMapAtlasSize) - IN.uv_EmissionMapAtlas.y) / _EmissionMapAtlasSize ); float2 NormalMapAtlasUV = float2( (float(_NormalMapAtlasIndex % _NormalMapAtlasSize) + IN.uv_NormalMapAtlas.x) / _NormalMapAtlasSize, 1.0 - (float(_NormalMapAtlasIndex / _NormalMapAtlasSize) - IN.uv_NormalMapAtlas.y) / _NormalMapAtlasSize ); fixed4 c = tex2D (_MainTexAtlas, MainTexAtlasUV); fixed4 e = tex2D (_EmissionMapAtlas, EmissionMapAtlasUV); fixed4 n = tex2D (_NormalMapAtlas, NormalMapAtlasUV); o.Albedo = c.rgb * _MainTexColor.rgb; o.Emission = e.rgb * _EmissionColor.rgb; o.Normal = UnpackNormal(n); } ENDCG } FallBack "Diffuse" CustomEditor "VRCBoard.VRCBoardShaderEditor" }