Помогите разобраться в эффектах

Тема в разделе "WASM.RESEARCH", создана пользователем _dc, 9 авг 2005.

  1. _dc

    _dc New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    7
    Есть два куска кода - они выполняют различные эффекты с изображением.



    Надо определить математические выкладки по которым это происходит.

    x2=f1(x1); y2=f2(y1);

    f1-? f2-?



    Помогите кто чем может.

    У меня например сразу возникает первый вопрос.

    имеются входные аргументы.

    arg0 - какие-то вектора

    arg4 - какие-то вектора

    arg8 - сила эффекта



    поидее это должно происходить по алгоритму

    arg4<-f(arg_0)

    т.е. результат как-то должен куда-то заноситься, но этого не происходит.Т.е. поидее должна быть строка типа



    mov [esp+arg_4],.. ;такой строки нету. Почему ?



    <font color="red]первое и последнее предупреждение за пост листинга в текст сообщения</font><!--color-->



    [​IMG] 1855951280__effects.zip
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _dc



    Ты бы тут еще весь DirectX 9.0c дизассемблированный выложил :) Лучше дай посмотреть как сам эффект выглядет, будет гораздо нагляднее.
     
  3. _dc

    _dc New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    7
    вот прикрепил картинки.



    Я уже куда только не писал и в лабораторию при МГУ. и на форумы на разные. Книг по этому вообще нету. Такое впечатление что либо этим вообще никто не занимается, либо занимается.. но не хочет делится.



    Я всю литературу по этой области классифицирую на 3 категории:

    - записки сумасшедшего ( абсолютный бред )

    - уводящие в сторону

    - сообщающие то, что и так понятно.



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



    Потому что я от этих эффектов уже на стену хочу залезть.
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Не прикрепились твои картинки. Скинь мне на мыло.
     
  5. _dc

    _dc New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    7
    отправил.. я прикреплял, но почему-то она не прикреплялась. Выслал.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _dc



    Блин, я-то думал... :) Ну да ладно.



    Эффекты простенькие. Неужели сам не додумаешся?
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _dc







    Собственно так оно и есть. Пиксель-в-пиксель конечно не получится, но характер отображения по-моему очевиден.
     
  8. _dc

    _dc New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    7
    Меня больше интересует тот, который увеличивает/уменьшает.



    1. вычисление должны выполняться быстро. потому-что работать должно в реал-тайме.

    2. я пробовал натягивать изображение на сферическую поверхность ( часть сферы ).

    результат :плохое качество - видна граница и вычисляется долго



    Они натягивают изображение на какую-то поверхность, которая плавно из горизонтального положения. Что-то типа функции Гаусса.



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



    что именно я нигде и не смог найти
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _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
     
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _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) можно придумать сколько угодно.
     
  11. _dc

    _dc New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    7
    нифига ты даешь! как ты это понял...не знаю.



    я щас проанализирую, то на сколько ты прав и насколько это работает.



    есть еще два эффекта. только там я вообще не представляю какими законами их можно сделать. потом надо к тебе обратиться ))



    блин если ты прав. это будет дело чести для меня тоже увидеть в ассемблерных листингах эту зависимость . пока до этого это не получалось ((
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _dc







    Я ассемблер даже не смотрел :) Там действительно черт ногу сломит. Все видно из самой картинки. Сразу же :derisive:



    Не забудь, что при расчетах x и y картинки должны измеряться в пределах [-1 ; 1]. А конечный результат уже масштабируется в позицию пикселя.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _dc



    Да, самое главное.



    На самом деле задачу надо решать наоборот :)

    Тоесть, сейчас она решается так: "вот наш пиксель, куда он придет?"

    А решать надо так: "Вот пришел пиксель. Откуда?" :) Это чтобы в картинке дырок не было.



    Для

    r2 = normalized(r1) * |r1| * (1 - exp(-dot(r1, r1)))

    все довольно просто. Обратная выглядит так:



    r1 = normalized(r2) / (|r1| * (1 - exp(-dot(r1, r1))))
     
  14. _dc

    _dc New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    7
    да про то, что используем обратную функцию это я знаю.

    там есть два способа

    1. использовать обратную функцию

    2. использовать прямую, но потом "восстанавливать дырки" интерполяцией кажется.



    Слушай извини за глупый вопрос. в чем разница в твоих обозначения между

    normalize(r1) и |r1|

    мне казалось что нормирование вектора - это как раз нахождение его длины. т.е. поидее |r1| и normalize(r1) это одно и то же. или у тебя это разное ??
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _dc







    Не normalize, а normalized







    Нет, нормирование вектора это деление вектора на его длину, или говоря математически грамотно, умножение на величину, обратную к его норме.



    normalized(a) = (1 / |a|) * a
     
  16. _dc

    _dc New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2005
    Сообщения:
    7
    >все довольно просто. Обратная выглядит так:

    r1 = normalized(r2) / (|r1| * (1 - exp(-dot(r1, r1))))



    здесь ты ошибся. обратную функцию будет сложно найти. Это не обратная функцийя. у тебя получается функция типа

    r1 = f(r2,r1)..

    справа не должно быть r1.
     
  17. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _dc



    Ошибочка :)



    r1 = normalized(r2) / (|r2| * (1 - exp(-dot(r2, r2))))



    Нет, не оно?
     
  18. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Нет, фтгня полная :) Надо F2(x) попроще придумать. Ща...
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Попробуй так:



    F2(x) = 1 - (1 / (x^2 + 1))



    И тогда:



    r1 = normalized(r2) * k,



    где k - один из вещественных корней уравнения



    x^3 - |r2| x^2 - |r2| = 0



    Какой? А хрен его знает :) Будем думать дальше...
     
  20. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Еще одно условие.



    F2'(0) = 0, чтобы не было конуса в центре картинки.