Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Почему видно углы ? (4 стр)

Почему видно углы ? (4 стр)

Поделиться

Страницы: 1 2 3 4 5 Следующая

SuslikМодераторwww2 ноя. 20177:30#45
Misanthrope
ох и долго мы в прошлый раз воевали, когда на линии пересечения двух областей освещённости от диффуза на сфере была лишняя линия заметна.. это именно что оптический эффект. можно частично вылечить гамма-коррекцией, кстати. то есть если переход в линейном пространстве рисовать, то в srgb-пространстве он будет примерно квадратичный(плавнее).
MrShoorУчастникwww2 ноя. 20178:28#46
Suslik
> когда на линии пересечения двух областей освещённости от диффуза на сфере была лишняя линия заметна.. это именно что оптический эффект
Ну какой в баню это оптический эффект, если это была честная седловая точка. Я даже 100500 пруфов приводил. Ты у себя под "удачными" углами поставил свет, получил отсутсвие линии, и сделал вывод что там нет седловой точки. А потом когда я попытался тебе показать, что это не так - слился с треда. Оптический эффект блин.

Правка: 2 ноя. 2017 8:30

MikleМодераторwww2 ноя. 20179:03#47
Suslik, MrShoor, в данном случае света нет, проблема другая, точнее, их изначально было две:

1:
Misanthrope
> есть две текстуры, одна синяя, другая градиент от синего к белому
То есть функция цвета от координаты непрерывная, но не гладкая, глаз замечает такую смену. Если бы градиент был не линейный, а, к примеру, по параболе (от точки с нулевой производной), то шва было бы не видно.
2:
Неверный расчёт сферических координат, градиент менялся в зависимости от того, смотрим мы в направлении ребра, либо вершины куба.

Правка: 2 ноя. 2017 9:19

SuslikМодераторwww2 ноя. 201710:40#48
MrShoor
> Ну какой в баню это оптический эффект, если это была честная седловая точка
я ещё тогда сказал всё, что хотел. понимаю, что тебе очень нравится использовать термин "седловая точка", но я не уверен, что ты вполне понимаешь его значение, как минимум потому что он применим только к поверхностям с определёнными локально вторыми производными, отличными от нуля, а в случае суммы двух градиентов они как бы везде равны нулю кроме границы градиентов, где производные не определены. я не исключаю, что в твоих рассуждениях есть рациональное зерно, но ты его слишком самоуверенно и, одновременно с этим, не слишком грамотно пытаешься донести, чтобы мне его с тобой было интересно обсуждать.

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

я ещё в том треде: http://www.gamedev.ru/code/forum/?id=220364&page=2
приводил, как мне кажется, более простую картинку, где виден тот же эффект: просто при аддитивном наложении двух градиентов:
Изображение
на иллюстрации точка B кажется темнее точки C, хотя их цвета совпадают, в чём можно убедиться с помощью пипетки. то есть эффект — чистой воды оптическая иллюзия.

Правка: 2 ноя. 2017 10:42

0xc0deПостоялецwww2 ноя. 201711:47#49
Вся проблема сабжа в том, что градиент расчитывается не по сфере, а по плоскостям куба.
MisanthropeПостоялецwww2 ноя. 201712:29#50
0xc0de
> Вся проблема сабжа в том, что градиент расчитывается не по сфере, а по плоскостям куба.
а точнее, почему "товарищ пипедко" показывает что перепада нет, а глаз видит что есть.
ArochПостоялецwww2 ноя. 201712:31#51
MrShoor
> И ты даже можешь показать где этот угол? :)
+ Показать
ArochПостоялецwww2 ноя. 201712:34#52
Misanthrope
> а точнее, почему "товарищ пипедко" показывает что перепада нет
а ты пипеткой потыкай на протяжении всей линии в направлении градиента и составь график изменения цвета и сравни его с оригинальным градиентом.
0xc0deПостоялецwww2 ноя. 201712:43#53
Misanthrope
> а точнее, почему "товарищ пипедко" показывает что перепада нет, а глаз видит
> что есть.
Глаз видит, что есть стык градиента на плоскостях куба так как грани расположены под 90 градусов. Тебе нужно сделать, как посоветовал MrShoor - перевести координату с плоскости куба на сферу/сферические координаты и расчитать градиент по широте.
MikleМодераторwww2 ноя. 201713:47#54
Misanthrope
Если делаешь по моим формулам, там небольшая ошибочка, в двух местах 127.5 (то есть половина от размера текстуры минус 0.5) нужно заменить на 128 (половина от размера текстуры):
  ' Верх-низ
  For y = 0 To 255
    For x = 0 To 255
      k = Atn(128 / Sqr(((x - 127.5) ^ 2 + (y - 127.5) ^ 2)))
      k = k * 3.1415926 / 4
      pic1.PSet (x, y), Gradient(c1, c2, k)
    Next x
  Next y

  ' Бок
  For y = 0 To 255
    For x = 0 To 255
      k = Atn(Sqr((y - 127.5) ^ 2 / (128 ^ 2 + (x - 127.5) ^ 2)))
      k = k * 3.1415926 / 4
      pic2.PSet (x, y), Gradient(c1, c2, k)
    Next x
  Next y
Хотя на глаз это не заметно.
0xc0de
> так как грани расположены под 90 градусов
При чём тут вообще угол между гранями? Наблюдатель всегда находится в центре куба и видит прилегающие грани под одинаковым углом.

Правка: 2 ноя. 2017 13:49

MrShoorУчастникwww2 ноя. 201713:56#55
Suslik
> понимаю, что тебе очень нравится использовать термин "седловая точка"
Ок, представим себе сферу. Мы смотрим в направлении (0,0,-1) из позиции (0,0,10). Для простоты у нас будет ортогональная проекция, и видим мы целиком полусферу.
В точке XY нормаль сферы будет N = (x, y, z). Нормаль у нас единичная, а значит мы можем выразить z = (1 - x*x - y*y)^0.5. Так как мы видим полусферу, то для наших точек Z всегда будет положителен.
Теперь осветим нашу сферу двумя направленными источниками света:
L1 = (0,  0.9063, 0.4226)
L2 = (0, -0.9063, 0.4226)
(я сразу развернул вектора света, чтобы dot procuct брать)

Ну и свет у нас считается как C = max(0, dot(L1, N)) + max(0, dot(L2, N));
Собственно подставляем наш свет, и получаем
C = max(0, 0.9063*y + 0.4226*(1 - x*x - y*y)^0.5) + max(0, -0.9063*y + 0.4226*(1 - x*x - y*y)^0.5)

Теперь берем, и загоняем все это в wolfram:
https://www.wolframalpha.com/input/?i=z+%3D+max(0,+0.9063*y+%2B+0.4226*(1+-+x*x+-+y*y)%5E0.5)+%2B+max(0,+-0.9063*y+%2B+0.4226*(1+-+x*x+-+y*y)%5E0.5)

поплющило чет парсер от такого урла, копируйте адрес

И получаем вот такую штуку:
graph | Почему видно углы ?

> применим только к поверхностям с определёнными локально вторыми производными, отличными от нуля, а в случае суммы двух градиентов они как бы везде равны нулю кроме границы градиентов, где производные не определены
Да, первая производная имеет разрыв первого рода и вторая производная в этом месте неопределена. Согласен, термин седловая точка тут не подходит, но я не знаю как эта штука правильно называется, когда у нас производная функции вдоль направления имеет и максимум и минимум. У седловой точки тоже вдоль одного направления минимум, а вдоль другого максимум, но только в нашем случае у нас в локальном минимуме разрыв первой производной.

Suslik
> приводил, как мне кажется, более простую картинку, где виден тот же эффект:
> просто при аддитивном наложении двух градиентов:
Да, излом первой производной в градиентах наш глаз умеет детектить, но у автора в нульпосте:
Изображение
Это не излом первой производной, а та самая седловая-неседловая функция, которую я выше показал на графике.

p.s. Любопытен тот факт, что такой излом дает именно max, и если его убрать, то функция вырождается в обычный эллипсоид

UPD. Перечитал пост, понял что потерял корень в z = 1 - x*x - y*y. Исправил с учетом корня, и обновил все ссылки.

Ибо нефиг в пол пятого за компом сидеть... все, ушел спать.

Правка: 3 ноя. 2017 21:50

SuslikМодераторwww2 ноя. 201714:23#56
MrShoor
> z = 1 - x*x - y*y
корень забыл. в этом случае сути это не меняет.

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

> производная функции вдоль направления имеет и максимум и минимум
на самом деле да, здесь получается просто минимум функции по направлению, производная по этому направлению меняет знак и это выглядит как более тёмная область, потому что она действительно ей является не из-за оптической иллюзии, я согласен. однако, и эффект оптической иллюзии тоже имеет место быть в точках излома производных даже там, где по факту минимума нет, эти точки кажутся темнее (иллюстрация из #48)

Правка: 2 ноя. 2017 14:28

0xc0deПостоялецwww2 ноя. 201714:31#57
Mikle
> При чём тут вообще угол между гранями? Наблюдатель всегда находится в центре
> куба и видит прилегающие грани под одинаковым углом.

При том, что расстояние до центра плоскости и до стыка плоскостей разное.

Правка: 2 ноя. 2017 14:36

MrShoorУчастникwww2 ноя. 201714:35#58
Suslik
> корень забыл. в этом случае сути это не меняет.
Да, я уже понял, уже поправил все. Поверхность стала чуть глаже.

Suslik
> неверно. у седловой точки знак радиуса кривизны поверхности(знак второй
> производной) будет разным для двух направлений.
Да, я в терминах сильно плаваю обычно. Согласен, седловой точкой это называть нельзя.

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

MikleМодераторwww2 ноя. 201715:04#59
0xc0de
> При том, что расстояние до центра плоскости и до стыка плоскостей разное.
Но это не создаст видимого излома (шва, перепада) на стыке.

Страницы: 1 2 3 4 5 Следующая

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

2001—2017 © GameDev.ru — Разработка игр