Как стать автором
Обновить

Комментарии 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 и, судя по всему, нет поддержки от автора.
Сам я не пробовал использовать ни одну из этих двух систем, сравниваю только по описанию и скриншотам.
Спасибо! Если есть возможность, поделись пакетом. Если в итоге понравится, то к выходу в релиз обязательно приобрету лицензию
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации