Комментарии 20
Интересно, готов купить. К тому же обещаете такую производительность!

Хотелось бы больше примеров использования/реализации, а не только готовые картинки. С удовольствием бы посмотрел более мелкую сетку в действие.
Пока существует только демо с ракетой из поста. Дальше планирую сделать простенький платформер.
Как раз хочу использовать в платформере, реализуйте комнату с многочисленными колонами, с однотипными и разнотипными формами, для проверки, падения и угла наклона света при разных ракурсах.

Надеюсь поняли меня, если что могу накидать прототип.
Тоже заинтересован, выкладывайте в стор. Только с ценой не наглейте :-)
Когда зашел — ожидал увидеть нормальный алгоритм, а не алгоритм в двух строчках (хотя-бы вставки кода делайте) с готовыми картинками.

P.S.:
На хабре приятно делиться знаниями, а не продавать их на ассет-сторе.
Аналогично, коллега! Читал статью и надеялся увидеть исходники и побольше теории.
Исходники очень легко вытаскиваются из билда, автор даже не озаботился обфускацией, так что пусть не расстраивается, если какой-то шустрый китаец выложит этот код в стор первее самого автора =)
i.imgur.com/B04anKA.png
Проще уж самому написать, чем выковыривать и разбираться в зависимостях :)
Нам с вами — да, но среднестатистическому хитрому китайцу (как показывает практика) — нет. Он ещё и демку эту продавать будет заодно, где-нибудь на локальных китайских ресурсах.
Освещение (да и стиль ваших игр) чем-то напоминает тёмные локации Knytt Underground. Вы случайно им не руководствовались?
8мс даже при 30фпс это 25% общего бюджета на кадр(а при 60 так и вообще все 50%). С другой стороны, если все действительно выполняется на GPU и он все равно недогружен работой, это может быть и без разницы.А выглядит, судя по демо очень клево.
И конечно было бы интересно взглянуть на шейдер трассировки.
Шейдер трассировки достаточно простой. Ниже одна из его версий. А насчет 8 мс на рисование я немного не правильно написал. В 8 мс/кадр укладывается вся представленная мной демка, содержащая 30-40 Drawcalls и около 8000 треугольников.

Трассировка на 9 точек
Shader "Light2D/Light 9 Points" {
Properties {
	_MainTex ("Light texture", 2D) = "white" {}
	_ObstacleMul ("Obstacle Mul", Float) = 500
	_EmissionColorMul ("Emission color mul", Float) = 1
}
SubShader {	
	Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

	LOD 100
	Blend OneMinusDstColor One
	Cull Off
	ZWrite Off
	Lighting Off

	Pass {  
		CGPROGRAM
			// Upgrade NOTE: excluded shader from DX11 and Xbox360; has structs without semantics (struct v2f members sp)
			#pragma exclude_renderers d3d11 xbox360
			#pragma vertex vert
			#pragma fragment frag
			#pragma glsl_no_auto_normalization
			
			#include "UnityCG.cginc"

			struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
				fixed4 color : COLOR0;
				fixed4 normal : TEXCOORD1;
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
				fixed4 color : COLOR0;
				half4 scrPos : TEXCOORD2;
				half4 scrPosCenter : TEXCOORD1;
			};
			
		    sampler2D _ObstacleTex;
			sampler2D _MainTex;
		 	half _ObstacleMul;
			half _EmissionColorMul;

			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = v.texcoord;
				o.scrPos = ComputeScreenPos(o.vertex);
				o.scrPosCenter = v.normal;
				o.color = v.color;
				return o;
			}
			
			fixed3 maximize(fixed3 vec){
				vec = max(vec, fixed3(0.01, 0.01, 0.01));
				return vec/max(vec.x, max(vec.y, vec.z));
			}

			half sum(half3 vec){
				return vec.x + vec.y + vec.z;
			}

			fixed4 frag (v2f i) : COLOR
			{
                fixed2 thisPos = (i.scrPos.xy/i.scrPos.w); 
				fixed2 centerPos = i.scrPosCenter;
				const fixed sub = 0.111111111111;

				fixed m = _ObstacleMul*length((thisPos - centerPos)*fixed2(_ScreenParams.x/_ScreenParams.y, 1)*sub);
				
				fixed4 tex = tex2D(_MainTex, i.texcoord);

				clip(tex.a - 0.005);

				fixed4 col = i.color*fixed4(tex.rgb, 1)*tex.a;
				
				fixed pos = 1;

				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);
				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);
				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);
				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);
				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);

				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);
				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);
				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);
				pos -= sub; col *= saturate(1 - tex2D(_ObstacleTex, lerp(centerPos, thisPos, pos))*m);

				col.rgb *= _EmissionColorMul;

                return col;
			}
		ENDCG
	}
}

}

Вообще сама система крайне интересная, пускай и применение ее достаточно узкое. Было бы неплохо доработать это и выложить в Asset Store — бесплатно или платно сами уж решайте.

Кстати ссылки на демо битые :(
2D Dynamic Lights and Shadows PRO судя по всему работает через колайдеры и генерацию мешей. Свет не мягкий, четко видны грани. При небольшом количестве источников освещения и колайдеров на сцене должно работать быстрее, чем у меня. Возможно, присутствует та же проблема что и у 2DVLS, когда источник света больших размеров считается очень не точно из-за того, что используются рейкасты физики.
2D Light System по идее работает схожим образом с моей т.е. на GPU. Только там используется плоскость XZ вместо XY и, судя по всему, нет поддержки от автора.
Сам я не пробовал использовать ни одну из этих двух систем, сравниваю только по описанию и скриншотам.
Спасибо! Если есть возможность, поделись пакетом. Если в итоге понравится, то к выходу в релиз обязательно приобрету лицензию
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.