Пятница, 22 Ноября 2024, 04:41

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Локальная темнота для 2D, есть идеи?
alexsilentДата: Пятница, 20 Марта 2015, 16:42 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Привет ребята, нужно локальное затенение для 2D, есть идеи, как реализовать?
К примеру, участок - Тёмная комната, где без фонаря не сунуться, но на этой локации в остальных местах светло, дневное освещение.
К сожалению, я так понимаю отрицательное значение света нельзя сделать, как это можно сделать в некоторых 3д редакторах,
а какие ещё есть методы? Я пробовал сделать шейдер, который становится прозрачным только там где падает свет,
но мне так почти никто не помог с этим, может есть ещё методы?


Сообщение отредактировал alexsilent - Суббота, 21 Марта 2015, 18:36
WTALKERДата: Пятница, 20 Марта 2015, 17:37 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
помочь не смогу, просто поясню:

Типа такого (но в 2Д)?
А то я, например, мысленно не понял.



скинь приблизительное изображение твоей хотелки
MANMANAДата: Пятница, 20 Марта 2015, 20:30 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
в сторону 2d теней/2d shadows смотрел?
А этот пост не поможет?


http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею
alexsilentДата: Суббота, 21 Марта 2015, 09:27 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата WTALKER ()
Типа такого (но в 2Д)?
А то я, например, мысленно не понял.

WTALKER, примерно вот так. Есть тёмная комната, это можно было бы спрайтом сделать, НО
тогда её не осветишь светом, в этом случае очень бы пригодилось отрицательное значение иллюминации у света,
чтобы задние спрайты "затемнять" тёмнотой, но когда приходишь со светом, темнота бы рассеивалась,
но в Юнити это не доступно, как я понял.


Добавлено (21 марта 2015, 09:23)
---------------------------------------------
Цитата MANMANA ()
в сторону 2d теней/2d shadows смотрел?
А этот пост не поможет?

MANMANA, спасибо! К сожалению, 2д тени не подходят, потестил сейчас и получается там тоже есть точка освещения,
а нужно в первую очередь место затенения, а освещение находится не в точке а повсюду в других местах, кроме тёмной комнаты.

Пост выглядит интересно, я уже натыкался на подобный, но там только виден свет, лучше бы видно была только темнота.
(не знаю как шейдер исправить, не силён в них)

Добавлено (21 марта 2015, 09:27)
---------------------------------------------
Появилась идея, но может её нельзя реализовать на практике, а в программировании шейдеров я не понимаю почти.

Если бы взять Particle/Multiply шейдер, и научить его принимать свет, так он при попадании света будет осветляться в нужном месте
и затемнять всё остальное в комнате. Только как этого добиться?!


Сообщение отредактировал alexsilent - Суббота, 21 Марта 2015, 11:24
MANMANAДата: Суббота, 21 Марта 2015, 11:44 | Сообщение # 5
почти ветеран
Сейчас нет на сайте
alexsilent, распиши алгоритм, как ты выясняешь, что комната темная.

http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг
VKонтакте 3Dbuffer

Последнее:

Новый раздел "Текстуры"

Как запатентовать, защитить техническое решение, игру, идею
alexsilentДата: Суббота, 21 Марта 2015, 12:56 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
Цитата MANMANA ()
alexsilent, распиши алгоритм, как ты выясняешь, что комната темная.

MANMANA , вручную (одна из причин почему не подходит вездесущая тема про 2D тени в гугле), то есть я хочу выбирать любую область по вкусу, которую хочу сделать тёмной, как локальный "туман войны" (скажем захочу туман войны наложить только на одну комнату), просто чтобы не было видно там ничего без фонаря.
У меня уже есть приблизительный план, всего лишь нужно чтобы свет делал прозрачным то место спрайта на которое попадает. И тогда можно было бы комнату накрыть спрайтом темноты (просто нарисованным вручную), а свет попав на это место делал прозрачным это место, куда попал.
Жаль я в шейдерах не понимаю. Пока гуглю другие возможные варианты.


Сообщение отредактировал alexsilent - Суббота, 21 Марта 2015, 12:59
KamiRoninДата: Суббота, 21 Марта 2015, 12:58 | Сообщение # 7
почти ветеран
Сейчас нет на сайте
все делается стандартными средствами:


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
alexsilentДата: Суббота, 21 Марта 2015, 13:55 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата KamiRonin ()
все делается стандартными средствами:


KamiRonin, спасибо большое! А как так получилось, что спрайт исчезает и открывается задний план?

У меня получилось только то, что высветляется теневой объект, но не пропадает ибо тут на примере открывается задний фон (зелёного цвета).
У меня, если что-то под спрайтом находится, то не проявляется, можно конечно, как с роботом сделать хитрость,
но местами некоторые объекты у меня очень большой формы и могут выходить из пещеры, как например камни или ещё что-то.



Или может я не так собрал, положил тень в отдельный слой коллайдера (пробовал в разные для эксперимента)
и свету сделал Culling на тот же слой. Шейдер выбирал Sprites/Diffuse на теневой объект.


Сообщение отредактировал alexsilent - Суббота, 21 Марта 2015, 14:24
KamiRoninДата: Суббота, 21 Марта 2015, 14:40 | Сообщение # 9
почти ветеран
Сейчас нет на сайте
Цитата alexsilent ()
но местами некоторые объекты у меня очень большой формы и могут выходить из пещеры, как например камни или ещё что-то.

их надо разрезать на два спрайта - один наружний (sprite default материал) и внутренний (sprite lit)

по фону - у меня это отдельный спрайт, который просто сливается с фоном.
т.е. в твоем случае - я бы сделал фоновый спрайт в комнате так - вырезал бы из фона по размеру комнаты и наложил поверх, подогнал бы по яркости на полном освещении.

но да, это все ухищрения.

есть другой вариант - шейдер с маской, рентген и тп. вот тут посмотри подборку, может подберешь что нибудь.


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
alexsilentДата: Суббота, 21 Марта 2015, 17:28 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Цитата KamiRonin ()
есть другой вариант - шейдер с маской, рентген и тп. вот тут посмотри подборку, может подберешь что нибудь.


X-Ray почти то что нужно! Но не работает от света.
KamiRoninДата: Суббота, 21 Марта 2015, 17:59 | Сообщение # 11
почти ветеран
Сейчас нет на сайте
Цитата alexsilent ()
Но не работает от света.

да, там скрипт сделан под мышь - вычисляет вектор "просвечивания"... в общем его нужно адаптировать.
без шейдеров - мелкой возни много - как я показал выше.. а шейдер нужно под свои нужды садаптировать и скрипт под него написать с поправками.
таааак чтоооо... выбор за тобой ))


Мыслю - значит программирую...
Конструктивная критика - умных ведет к совершенству...
Великие умы обсуждают идеи, средние - обсуждают поступки, а малые - людей.
alexsilentДата: Суббота, 21 Марта 2015, 18:15 | Сообщение # 12
почти ветеран
Сейчас нет на сайте
Решил попробовать взять стандартный шейдер спрайта (Sprites/Diffuse)
я полагаю, нужно примерно сделать так:

1) инвертировать весь полученный цвет
2) положить цвет в альфа канал (с этим разобрался)

Как это сделать?

Код

Shader "Custom/LightShade" {
Properties {
     _Color ("Main Color", Color) = (1,1,1,1)
     _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
}

SubShader {
     Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
     LOD 200

CGPROGRAM
#pragma surface surf Lambert alpha:blend

sampler2D _MainTex;
fixed4 _Color;

struct Input {
     float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
     fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
     o.Albedo = c.rgb;
     o.Alpha = c.rgb;
}
ENDCG
}

Fallback "Legacy Shaders/Transparent/VertexLit"
}


Пока что, по совету одного человека заменил строку альфу, прировнял к цвету
было так
Код
o.Alpha = c.a;

а сделал так
Код
o.Alpha = c.rgb;
// теперь альфа канал должен по идее зависеть от цвета

Решил попробовать инвертировать
Код
o.Alpha = -c.rgb;

но текстура вся просто пропадает, видимо не так инвертировать нужно

Добавлено (21 марта 2015, 18:15)
---------------------------------------------
сделал такую строку, стало получше (по крайней мере видно что-то), но альфа не инвертировалась совсем

Код
o.Alpha = 1 - c.rgb;




к сожалению самая видимая часть остаётся у источника света, а должно инвертироваться и стать наоборот,
чтоб у источника света текстура более всего прозрачная должна быть


Сообщение отредактировал alexsilent - Суббота, 21 Марта 2015, 18:04
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг