Войти
ПрограммированиеФорумГрафика

Шейдеры: как повернуть нормаль к свету?

#0
17:49, 9 мая 2011
пример | Шейдеры: как повернуть нормаль к свету?

У меня есть (к примеру) 2 объекта(линии красного цвета). Их освещает точечный источник света. Поэтому тот объект что ближе к свету будет темнее, чем тот что дальше.
Как повернуть нормаль 2-го объекта к свету. Чтобы угол был такимже как у 1-го объекта. Это нужно что бы 1 и 2-й объект были одинаково освещены при точичном освещении.

#1
17:57, 9 мая 2011

Может, просто юзать directional light для таких объектов?

#2
17:57, 9 мая 2011

ronniko
> Как повернуть нормаль 2-го объекта к свету. Чтобы угол был такимже как у 1-го
> объекта. Это нужно что бы 1 и 2-й объект были одинаково освещены при точичном
> освещении.
ты осознаёшь, что из правильного варианта хочешь сделать неправильный? : )

Более точно опиши ситуацию - можно многими способами сделать - надо значть только что и для чего

#3
18:06, 9 мая 2011

.L
Я осознаю что из правильного варианта делаю неправильный. Что бы было более естественнее.
RPGman
Может, просто юзать directional light для таких объектов?
Да можно. А можно и вообще без diffuse и texture.
Как directional light делать я знаю.

Примерно, я так думаю, надо что бы у этих 2-х объектов были нормали направлинны по Y так что бы угол был одинаковый к свету (у всех нормалей данных 2-х объектов).
Но вот как это в шейдере реализовать. Не пойму. Как скаректировать нормали под одинаковый угол относительно точечного источника света.

#4
18:09, 9 мая 2011

ronniko
Юзай одну и туже позицию для вычисления вектора падения луча.

#5
18:16, 9 мая 2011

А где тут первый и второй? )

#6
18:27, 9 мая 2011

ronniko
Никак. Второй объект ничего не знает о первом, соответственно второй объект не имеет никакой информации о угле первого.

#7
18:35, 9 мая 2011

Может просто увеличить освещенность пропорционально расстоянию до объекта не трогая нормали?

#8
11:14, 10 мая 2011

Можно нормализовать рассчитанную освещённость, только зачем? А если второй объект отдалить в 1000 раз, он тоже должен быть освещён так же ярко?

#9
15:39, 10 мая 2011

Берем из первого обьекта. cos A = ( -l; n )/(|-l|*|n|), где A - угол между векторами. ( -l; n ) - скалярное произведение векторов, т.е. x1*x2+y1*y2 + z1*z2; l - световектор; n - нормаль. -l потому что для вычисления.

Применяем к второму обьекту.

Находим  векторное произведение: dotln = {  y1*z2 - z1*y2; -( x1*z2 - x2*z1); x1*y2-x2*y1}( или просто dot(), смотря какой у тебя шейдер ). Главное не перепутай компоненты, порядок важен! Сначала -l потом n. Т.е. dot(-l;n). Создаем новый вектор с длиной вектора нормали второго обьекта и направлением -l. И поворачиваем этот вектор вокруг оси dotln на угол arccos( A ). Вот и все.

Нет, ну можно конечно и позодротствовать ещё. Например формула х( -l(x) ) + y( -l(y) ) + z( -l(z) ) = cosA|-l||n| - это формула ВСЕХ векторов отклоненых от заданого на угол А. Далее определитель от искомого ветора, вектора нормали и света равен нулю. Т.к. они кампланарны меж собой. Система из этих условий даст на два вектора, которые кампланарны и отклонены от -l на A градусов. Выбираем нужный и вуаля... Но это какбы точный метод... а тот быстрый... точнее суровый.

#10
16:30, 10 мая 2011

Задавать направление света константой, а не вычислять направление на основе позиции источника и позиции фрагмента. Это и будет направленное освещение.

> Чтобы угол был такимже как у 1-го объекта. Это нужно что бы 1 и 2-й объект были одинаково освещены при точичном освещении.
А чтобы при точечном - это уже не естественно. Хотя если все таки надо от точечного (чтобы убедится в неестественности и потом переделать обратно) то можно двигать просто точечный источник на V1Pos-V2Pos (V1Pos и V2Pos - вектора позиций объектов)

ПрограммированиеФорумГрафика

Тема в архиве.