lPestl
@lPestl

Shader в Unity (v 5) для Android делает невидимыми объекты, у которых назначены LightMap. Как исправить и отображать LightMap`ы?

Пишу игру для Android. (UPD: пишу на Unity3d v5.4.0f2, в 5ой версии система запекания текстур изменилась). Есть необходимость в самописном шейдере, который отображает запеченные текстуры теней (lightmap). С написанием шейдеров - я новичок. Погуглив, нашел "заготовку" для такого шейдера. Он работает как надо когда включена платформа разработки PC, Mac & Linux standalone, но перестает отображать объекты, на которые уже запечены текстуры. После того как я его немного видоизменил, он стал отображать хотябы объекты, которым не назначена lightmap. Что мне нужно исправить, чтобы lightmap отображались на объектах?
Сам шейдер:
Shader "Custom/Some_lightmapped_shader" {

	Properties{
		_MainTex("Texture 1", 2D) = "white" {}
	}

		SubShader {
			Tags{ "RenderType" = "Opaque" }

			Pass{
			// Disable lighting, we're only using the lightmap
			Lighting Off

			CGPROGRAM
			// Must be a vert/frag shader, not a surface shader: the necessary variables
			// won't be defined yet for surface shaders.
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile LIGHTMAP_ON LIGHTMAP_OFF
			#include "UnityCG.cginc"

			struct v2f {
				float4 pos : SV_POSITION;
				float2 uv0 : TEXCOORD0;
				#ifdef LIGHTMAP_ON
				float2 uv1 : TEXCOORD1;
				#endif
			};

			struct appdata
			{
				half4 vertex : POSITION; // vertex position
				float2 texcoord : TEXCOORD0;
				#ifdef LIGHTMAP_ON
				float2 texcoord1 : TEXCOORD1;
				#endif
			};

			sampler2D _MainTex;
			float4 _MainTex_ST; // Define this since its expected by TRANSFORM_TEX; it is also pre-populated by Unity.

			v2f vert(appdata i) {
				v2f o;
				UNITY_INITIALIZE_OUTPUT(v2f, o);
				o.pos = mul(UNITY_MATRIX_MVP, i.vertex);

				// UnityCG.cginc - Transforms 2D UV by scale/bias property
				// #define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
				o.uv0 = TRANSFORM_TEX(i.texcoord, _MainTex);

				// Use `unity_LightmapST` NOT `unity_Lightmap_ST`
				#ifdef LIGHTMAP_ON
				o.uv1 = i.texcoord1.xy * unity_LightmapST.xy + unity_LightmapST.zw;
				#endif
				return o;
			}

			half4 frag(v2f i) : COLOR{
				half4 main_color = tex2D(_MainTex, i.uv0);

				// Decodes lightmaps:
				// - doubleLDR encoded on GLES
				// - RGBM encoded with range [0;8] on other platforms using surface shaders
				//inline fixed3 DecodeLightmap(fixed4 color) {
				// #if defined(SHADER_API_GLES) && defined(SHADER_API_MOBILE)
				 //return 2.0 * main_color.rgb;
				 //#else
				 //return (8.0 * main_color.a) * main_color.rgb;
				//#endif
				//}
				#ifdef LIGHTMAP_ON
				main_color.rgb *= DecodeLightmap(UNITY_SAMPLE_TEX2D(unity_Lightmap, i.uv1));
				#endif
				return main_color;
			}
			ENDCG
		}
	}
}


И скриншоты:
088d0a50b133408ca1c1b201d060a1ba.PNG0bbb2828d7aa41ba8bb56a2faa4038b3.PNG

На обоих скринах одна и та же модель. Только на первом - модель, для которой в сцене были запечены lighmap`ы, а вторая добавлена после запекания и соотвествующей текстуры теней не имеет. Шейдер у них один и тот же (приведен выше), но почему-то та модел у которой есть lightmap - не отображается.

Почему?

Что мне нужно исправить???
  • Вопрос задан
  • 900 просмотров
Решения вопроса 1
lPestl
@lPestl Автор вопроса
Если вдруг у кого-то возникнет такая же беда - пишу решение здесь.
Для того чтобы lightmap`ы отображались в Editore мне хватило того чтобы в Player Settings -> Other Settings -> Rendering Path переключить из Legacy Vertex Lit в любой другой. Правда Legacy Deffered (light prepass) вызвал при сборке на девайсе жесточайшие артефакты. В следствии чего остановился на положении Deffered. См. скрин:
fed80955bd6d47e28bf3419058b34aca.png

Но после этого возникла еще одна проблема: в Editor отображаются lightmaps, а при сборке на девайсе запеченных теней не видно. Пробороздив кучу форумов где-то случайно наткнулся, что просто шейдер, в котором указана строка #pragma multi_compile для lightmap`ов - на девайсе не отображает lightmap. Не знаю что это - баг в юнити или что-то неведомое, но после того как я закомментировал строку
#pragma multi_compile LIGHTMAP_ON LIGHTMAP_OFF
и все вхождения LIGHTMAP_ON и LIGHTMAP_OFF - на девайсе у меня все заработало и зепеченные в lightmap`ы тени начали отображаться. Всем спасибо, камера стоп.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы