Страница 1 из 1

Источник света в Screen Space

СообщениеДобавлено: 03 ноя 2017, 06:57
kripto289
Кто-нибудь знает как перевести attenuation у источника света в screen space пространство?
Проблема на скрине
Изображение

должно быть всегда так при любом повороте.
Изображение

Я не совсем понимаю как работает UNITY_LIGHT_ATTENUATION.
Куда копать?

Re: Источник света в Screen Space

СообщениеДобавлено: 03 ноя 2017, 07:47
jetyb
Какого источника света? На сцене может быть 100500 источников света.
В шейдеры передаются только 8 ближайших и главный свет (см. файл UnityShaderVariables.cgic).

Если есть конкретный источник света, то можно передавать его параметры (цвет, позицию, интенсивность..) в шейдер.

Re: Источник света в Screen Space

СообщениеДобавлено: 03 ноя 2017, 16:42
kripto289
jetyb писал(а):Какого источника света? На сцене может быть 100500 источников света.
В шейдеры передаются только 8 ближайших и главный свет (см. файл UnityShaderVariables.cgic).

Если есть конкретный источник света, то можно передавать его параметры (цвет, позицию, интенсивность..) в шейдер.

Не я не про вертексный свет, а про пиксельный.
Point light источник с аддитивным пассом.
Quality pixel light > 1
Tags{ "LightMode" = "ForwardAdd"}
#if defined(POINT)
код для аттеньюации
#endif

У меня есть позиция источника света, его матрица и прочие параметры (которые прописаны autoLight.cginc)

Код я взял отсюда:
UNITY_LIGHT_ATTENUATION(attenuation, 0, i.worldPos.xyz);

Re: Источник света в Screen Space

СообщениеДобавлено: 07 ноя 2017, 08:20
jetyb
По-прежнему не совсем понимаю что вам надо. На скринах все вроде бы освещено корректно. Деревья правда освещены странно, но они сделаны совсем по-своему, под Directional Light, и обновляются через TerrainData.RefreshPrototypes.

Тень хотите к точечному свету добавить? Берется рендертекстура кубмэпа глубины, ставится на место источника света. Каждая точка кубмэпы - расстояние от источника света до ближайшего препятствия. Определяется глубина точки через функцию texCube из трехмерного вектора направления текущей точки относительно источника света. Вектор направления относительно источника света текущего пикселя можно вычислить из позиции текущего пикселя в мировом пространстве.
Все: зная глубину пискселя, можно узнать "виден ли он" из точки света. Если виден то его attenuation = 1, иначе -0.

Re: Источник света в Screen Space

СообщениеДобавлено: 26 дек 2017, 19:00
kripto289
jetyb писал(а):По-прежнему не совсем понимаю что вам надо. На скринах все вроде бы освещено корректно. Деревья правда освещены странно, но они сделаны совсем по-своему, под Directional Light, и обновляются через TerrainData.RefreshPrototypes.

Тень хотите к точечному свету добавить? Берется рендертекстура кубмэпа глубины, ставится на место источника света. Каждая точка кубмэпы - расстояние от источника света до ближайшего препятствия. Определяется глубина точки через функцию texCube из трехмерного вектора направления текущей точки относительно источника света. Вектор направления относительно источника света текущего пикселя можно вычислить из позиции текущего пикселя в мировом пространстве.
Все: зная глубину пискселя, можно узнать "виден ли он" из точки света. Если виден то его attenuation = 1, иначе -0.

Не в деревьях и тенях дело.
Я хотел добавить реалистичное освещение воды point источниками света.
В реальном мире, освещение воды выглядит как-то так (рис 4). (немного фотошопа)
https://i.imgur.com/yRySyus.png

Можно заметить, что это просто градиентный круг в экранном пространстве плоскости воды (рис 2).
Затем я просто отбросил пиксели по маске, ниже границы плоскости воды (рис 3).
Получился псевдообъёмный свет в плоскости воды (рис 4).