Комментарии 20
Интересно, готов купить. К тому же обещаете такую производительность!
Хотелось бы больше примеров использования/реализации, а не только готовые картинки. С удовольствием бы посмотрел более мелкую сетку в действие.
Хотелось бы больше примеров использования/реализации, а не только готовые картинки. С удовольствием бы посмотрел более мелкую сетку в действие.
-3
Тоже заинтересован, выкладывайте в стор. Только с ценой не наглейте :-)
-3
Когда зашел — ожидал увидеть нормальный алгоритм, а не алгоритм в двух строчках (хотя-бы вставки кода делайте) с готовыми картинками.
P.S.:
На хабре приятно делиться знаниями, а не продавать их на ассет-сторе.
P.S.:
На хабре приятно делиться знаниями, а не продавать их на ассет-сторе.
+18
Аналогично, коллега! Читал статью и надеялся увидеть исходники и побольше теории.
0
Исходники очень легко вытаскиваются из билда, автор даже не озаботился обфускацией, так что пусть не расстраивается, если какой-то шустрый китаец выложит этот код в стор первее самого автора =)
i.imgur.com/B04anKA.png
i.imgur.com/B04anKA.png
0
Освещение (да и стиль ваших игр) чем-то напоминает тёмные локации Knytt Underground. Вы случайно им не руководствовались?
0
8мс даже при 30фпс это 25% общего бюджета на кадр(а при 60 так и вообще все 50%). С другой стороны, если все действительно выполняется на GPU и он все равно недогружен работой, это может быть и без разницы.А выглядит, судя по демо очень клево.
И конечно было бы интересно взглянуть на шейдер трассировки.
И конечно было бы интересно взглянуть на шейдер трассировки.
+1
Шейдер трассировки достаточно простой. Ниже одна из его версий. А насчет 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
}
}
}
0
Вообще сама система крайне интересная, пускай и применение ее достаточно узкое. Было бы неплохо доработать это и выложить в Asset Store — бесплатно или платно сами уж решайте.
Кстати ссылки на демо битые :(
Кстати ссылки на демо битые :(
+1
Вы можете булетами сравнить ваше решение с 2D Light System и 2D Dynamic Lights and Shadows PRO? Хочется понять, чем такой подход лучше/хуже
0
2D Dynamic Lights and Shadows PRO судя по всему работает через колайдеры и генерацию мешей. Свет не мягкий, четко видны грани. При небольшом количестве источников освещения и колайдеров на сцене должно работать быстрее, чем у меня. Возможно, присутствует та же проблема что и у 2DVLS, когда источник света больших размеров считается очень не точно из-за того, что используются рейкасты физики.
2D Light System по идее работает схожим образом с моей т.е. на GPU. Только там используется плоскость XZ вместо XY и, судя по всему, нет поддержки от автора.
Сам я не пробовал использовать ни одну из этих двух систем, сравниваю только по описанию и скриншотам.
2D Light System по идее работает схожим образом с моей т.е. на GPU. Только там используется плоскость XZ вместо XY и, судя по всему, нет поддержки от автора.
Сам я не пробовал использовать ни одну из этих двух систем, сравниваю только по описанию и скриншотам.
+1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
2D система освещения для Unity3D, работающая на GPU