Графические фильтры

Тема в разделе "WASM.DirectX", создана пользователем NaZGuL, 27 окт 2005.

  1. _DEN_

    _DEN_ DEN

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



    Ну-ка :) Какое отношение матричный фильтр имеет к билинейной фильтрации? ;)
     
  2. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Гг :) Это одно и тоже :) Хотя смотря как посмотреть %) В фильтрации текстур там по другому чуток :)
     
  3. _DEN_

    _DEN_ DEN

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



    Ну если хорошенько подумать, то разница все же есть ;) Классический матричный фильтр содержит константы, а билинейная фильтрация это матричный фильтр, весами которого являются MOD-ы координат ;)
     
  4. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    _DEN_

    Полностью с тобой согласен. Только ВЫ не ответили на мой вопрос, правильно или нет работает мой алгоритм!? Если да, то какого %?№ при фильтрации получаются баги...
     
  5. _DEN_

    _DEN_ DEN

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



    Ну нету у меня сейчас времени проверять.

    Давай скрины на разных стадиях, чтобы показать как от нормального ты приходишь к мусору.
     
  6. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    Давайте снова вернемся к нашим баранам!(устроился на новую работу, по этому времяни на кодинг почти небыло)

    Разобрался я с этим %%%м ТВИРЛОМ. Оказалось, что артефакты возникают при фильтрации! Иногда всплывают такие нелепые число аж жуть! Дело кончилось тем, что я основательно пересел на VC (там такого нет, хотя код тотже).

    Нашел недавно статейку в которой ТВИРЛ деается по табличке! Строится массив [-r..r,-r..r] и заполняется смещениями, а затем использую эту табличку пробегаем по всей текстурке и получем нужный результат. Может кто объяснит чем этот метод лучше и какие есть подводные камни?

    tylerdurden, ты заикался про матричный фильтр. Может покажешь на пальцах как енту штуку навоять!



    _DEN_, помнится ты обещал инфу нарыть про саунд в демках!? Очень надо! Процесс стоит :) ... Сейчас меня очень интересуют семпловые генераторы, ну а остальное по мере возможностей...



    Буду очень рад узреть выши ответы.
     
  7. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia


    Извиняюсь, был не прав! Только что проверил на маленьком угле, ошибки фильтрации на лицо!
     
  8. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    Забыл про код!

    Вот он:
    Код (Text):
    1. void Twirl(int *_data,float amount)
    2. {
    3.  BYTE tmp[256][256][4];
    4.  memcpy(tmp,_data,256*256*4);
    5.  int offset=0;
    6.  for(int j=0;j<256;j++)
    7.  for(int i=0;i<256;i++)
    8.  {
    9.   float x = (float)(i - 127.0);
    10.   float y = (float)(j - 127.0);
    11.   float rad = (float)(1.0 - 0.007874*sqrt(x*x + y*y));
    12.   float offx,offy;
    13.   offy = (float)(127 + x*cos(MPI*rad*amount) - y*sin(MPI*rad*amount));
    14.   offx = (float)(127 + x*sin(MPI*rad*amount) + y*cos(MPI*rad*amount));
    15.   BYTE dx = int (offx);
    16.   BYTE dy = int (offy);
    17.   BYTE dx1 = dx + 1;
    18.   BYTE dy1 = dy + 1;
    19.   float c1 = offx - int (offx);
    20.   float c2 = offy - int (offy);
    21.   float c3 = 1 - c1;
    22.   float c4 = 1 - c2;
    23.  
    24.   int col;
    25.   int rgba=0;
    26.  
    27.   col = int(c1*c2*tmp[dx ][dy ][3]+
    28.             c1*c4*tmp[dx ][dy1][3]+
    29.             c3*c2*tmp[dx1][dy ][3]+
    30.             c3*c4*tmp[dx1][dy1][3]);
    31.   if (col>255) col=255;
    32.   if (col<0) col=0;
    33.   rgba += (BYTE)col << 24;
    34.  
    35.   col = int(c1*c2*tmp[dx ][dy ][2]+
    36.             c1*c4*tmp[dx ][dy1][2]+
    37.             c3*c2*tmp[dx1][dy ][2]+
    38.             c3*c4*tmp[dx1][dy1][2]);
    39.   if (col>255) col=255;
    40.   if (col<0) col=0;
    41.   rgba += ((BYTE)col) << 16;
    42.  
    43.   col = int(c1*c2*tmp[dx ][dy ][1]+
    44.             c1*c4*tmp[dx ][dy1][1]+
    45.             c3*c2*tmp[dx1][dy ][1]+
    46.             c3*c4*tmp[dx1][dy1][1]);
    47.   if (col>255) col=255;
    48.   if (col<0) col=0;
    49.   rgba += ((BYTE)col) << 8;
    50.  
    51.   col = int(c1*c2*tmp[dx ][dy ][0]+
    52.             c1*c4*tmp[dx ][dy1][0]+
    53.             c3*c2*tmp[dx1][dy ][0]+
    54.             c3*c4*tmp[dx1][dy1][0]);
    55.   if (col>255) col=255;
    56.   if (col<0) col=0;
    57.   rgba += ((BYTE)col) ;
    58.  
    59.   _data[offset++] = rgba;
    60.  }
    61. }
    Исходное изображение

    http://www.nazgulus.pochta.ru/image/img1.bmp


    Твирл, на угол 0.05

    http://www.nazgulus.pochta.ru/image/img.bmp
     
  9. NaZGuL

    NaZGuL New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    41
    Адрес:
    Russia
    Хмммм... Опять тишина. :dntknw:

    Заново переписал функцию. Результат уже лучше, но все равно баги (почему-то красный цвет вместе с синим быстро пропадают, а зеленый остается).
    Код (Text):
    1. BYTE Interpolate(BYTE p0,BYTE p1,BYTE p2,BYTE p3, float x,float y)
    2. {
    3.     float g0 = x - (int)x;
    4.     float g1 = y - (int)y;
    5.     float g2 = 1 - g0;
    6.     float g3 = 1 - g1;
    7.     int col  = (int)(g2*g3*p0+
    8.                     g2*g1*p1+
    9.                     g0*g3*p2+
    10.                     g0*g1*p3);
    11.    
    12.     return col;
    13. }
    14.  
    15. void Twirl(int *_data,float amount)
    16. {
    17.  BYTE tmp[256][256][4];
    18.  memcpy(tmp,_data,256*256*4);
    19.  int offset=0;
    20.  for(int i=0;i<256;i++)
    21.  for(int j=0;j<256;j++)
    22.  {
    23.   int x = (i - 128);
    24.   int y = (j - 128);
    25.   float offx,offy;
    26.   float rad = (float)(128.0 - sqrtf((float)x*x +(float)y*y));
    27.   BYTE dx,dy;
    28.  
    29.   if (rad<=0.0)
    30.   {
    31.       offx = (float)i;  offy = (float)j;
    32.       dx = i;   dy = j;
    33.   }
    34.   else
    35.   {
    36.       float angle = rad*rad*amount*0.000002;
    37.       float mcos = (float)cos(angle);
    38.       float msin = (float)sin(angle);
    39.       offx = (float)(128 + x*mcos - y*msin);
    40.       offy = (float)(128 + x*msin + y*mcos);
    41.       dx = (int)(offx) & 255;
    42.       dy = (int)(offy) & 255;
    43.   }
    44.   BYTE dx1 = (dx + 1) & 255;
    45.   BYTE dy1 = (dy + 1) & 255;  
    46.  
    47.   int rgba=0;
    48.   for (int cc=3;cc>=0;cc--)
    49.   {
    50.     rgba = rgba << 8;
    51.     rgba += Interpolate(tmp[dx ][dy ][cc],
    52.                         tmp[dx ][dy1][cc],
    53.                         tmp[dx1][dy ][cc],
    54.                         tmp[dx1][dy1][cc],offx,offy);  
    55.   }  
    56.   _data[offset++] = rgba;
    57.  }
    58. }
    Вот исходник