Есть два куска кода - они выполняют различные эффекты с изображением. Надо определить математические выкладки по которым это происходит. x2=f1(x1); y2=f2(y1); f1-? f2-? Помогите кто чем может. У меня например сразу возникает первый вопрос. имеются входные аргументы. arg0 - какие-то вектора arg4 - какие-то вектора arg8 - сила эффекта поидее это должно происходить по алгоритму arg4<-f(arg_0) т.е. результат как-то должен куда-то заноситься, но этого не происходит.Т.е. поидее должна быть строка типа mov [esp+arg_4],.. ;такой строки нету. Почему ? <font color="red]первое и последнее предупреждение за пост листинга в текст сообщения</font><!--color--> 1855951280__effects.zip
_dc Ты бы тут еще весь DirectX 9.0c дизассемблированный выложил Лучше дай посмотреть как сам эффект выглядет, будет гораздо нагляднее.
вот прикрепил картинки. Я уже куда только не писал и в лабораторию при МГУ. и на форумы на разные. Книг по этому вообще нету. Такое впечатление что либо этим вообще никто не занимается, либо занимается.. но не хочет делится. Я всю литературу по этой области классифицирую на 3 категории: - записки сумасшедшего ( абсолютный бред ) - уводящие в сторону - сообщающие то, что и так понятно. Вот я и подумал, что если среди людей занимающихся графикой никто не в состоянии объяснить как это делается, то может я найду помощь от тех кто связан с ассемблером. Потому что я от этих эффектов уже на стену хочу залезть.
_dc Собственно так оно и есть. Пиксель-в-пиксель конечно не получится, но характер отображения по-моему очевиден.
Меня больше интересует тот, который увеличивает/уменьшает. 1. вычисление должны выполняться быстро. потому-что работать должно в реал-тайме. 2. я пробовал натягивать изображение на сферическую поверхность ( часть сферы ). результат :плохое качество - видна граница и вычисляется долго Они натягивают изображение на какую-то поверхность, которая плавно из горизонтального положения. Что-то типа функции Гаусса. Но там сложность - там надо задавать смещения для точек а для сложных функций фиг знает как это задавать и вычислять. И у них нету там exp т.е. они используют что-то другое. что именно я нигде и не смог найти
_dc На fragment shader все будет летать. На нормальной видяхе конечно же. Никакие поверхности не нужны. Надо построить отображение. Рассмотрим прямоугольную двумерную декартову систему координат, для простоты с началом в центре картинки. r2 = f(r1), где r1 - радиус-вектор исходной точки, а r2 - радиус вектор точки после отображения. Для растяжения/сжатия (эффект #1) выражение упрощается до такого: r2 = normalized(r1) * F(|r1|), тоесть направление сохраняется, меняется только длина радиус-вектора. Ну и эта F(x) выглядет... Наверно как-то так: F(x) = pow(abs(x), a) * sign(x), с условием что -1 <= x <= 1
_DEN_ Хотя не совсем так Это будет F(x) = F1(x) * F2(x) Причем F1(x) = x, т.е. простой перенос, а F2(x) - некоторое возмущение, обладающее свойствами: F2(0) = 0 F2(+inf) = 1 F2'(x) > 0 для любого x >= 0 Например... F2(x) = 1 - exp(-x^2) И r2 = normalized(r1) * |r1| * (1 - exp(-dot(r1, r1))) Конечно же, этих F2(x) можно придумать сколько угодно.
нифига ты даешь! как ты это понял...не знаю. я щас проанализирую, то на сколько ты прав и насколько это работает. есть еще два эффекта. только там я вообще не представляю какими законами их можно сделать. потом надо к тебе обратиться )) блин если ты прав. это будет дело чести для меня тоже увидеть в ассемблерных листингах эту зависимость . пока до этого это не получалось ((
_dc Я ассемблер даже не смотрел Там действительно черт ногу сломит. Все видно из самой картинки. Сразу же Не забудь, что при расчетах x и y картинки должны измеряться в пределах [-1 ; 1]. А конечный результат уже масштабируется в позицию пикселя.
_dc Да, самое главное. На самом деле задачу надо решать наоборот Тоесть, сейчас она решается так: "вот наш пиксель, куда он придет?" А решать надо так: "Вот пришел пиксель. Откуда?" Это чтобы в картинке дырок не было. Для r2 = normalized(r1) * |r1| * (1 - exp(-dot(r1, r1))) все довольно просто. Обратная выглядит так: r1 = normalized(r2) / (|r1| * (1 - exp(-dot(r1, r1))))
да про то, что используем обратную функцию это я знаю. там есть два способа 1. использовать обратную функцию 2. использовать прямую, но потом "восстанавливать дырки" интерполяцией кажется. Слушай извини за глупый вопрос. в чем разница в твоих обозначения между normalize(r1) и |r1| мне казалось что нормирование вектора - это как раз нахождение его длины. т.е. поидее |r1| и normalize(r1) это одно и то же. или у тебя это разное ??
_dc Не normalize, а normalized Нет, нормирование вектора это деление вектора на его длину, или говоря математически грамотно, умножение на величину, обратную к его норме. normalized(a) = (1 / |a|) * a
>все довольно просто. Обратная выглядит так: r1 = normalized(r2) / (|r1| * (1 - exp(-dot(r1, r1)))) здесь ты ошибся. обратную функцию будет сложно найти. Это не обратная функцийя. у тебя получается функция типа r1 = f(r2,r1).. справа не должно быть r1.
Попробуй так: F2(x) = 1 - (1 / (x^2 + 1)) И тогда: r1 = normalized(r2) * k, где k - один из вещественных корней уравнения x^3 - |r2| x^2 - |r2| = 0 Какой? А хрен его знает Будем думать дальше...