Эффект RADIAL BLUR

Тема в разделе "WASM.DOS/BIOS/Vesa/ports", создана пользователем Mikl___, 24 дек 2016.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708

    Эффект RADIAL BLUR

    [​IMG]
    Если вы захотите подставить какую-нибудь другую картинку, то проделайте следующую последовательность действий:
    1. нарисуйте или считайте другую двух-цветную картинку в PaintBrush
    2. сохраните ее как монохромную картинку
    3. потом как 256-цветную
    4. и вот эту 256 цветную картинку можно подставлять вместо intel.bmp.
    Размер картинки естественно должен составлять 320x200, и bmp-файл не должен быть упакован, иначе у вас ничего не получиться.
    [​IMG]
    Идея radial blur`a проста: блюрить по кругу, то есть как в обычном случае блюрения по одной координате, но с переходом к полярным координатам.

    Выберем центр нашего блюра, пусть это будет, для простоты, центр экрана. Допустим разрешение экрана 320x200. Тогда центр экрана придется на точку с координатами (160,100). Сместим начало координат в эту точку: x'=x-160; y'=y-100. Теперь рассмотрим точку М с координатами, например, (185,65), эта точка будет нашей текущей точкой, на примере ее я расскажу как выбирать вторую точку, чтобы сблюрить их цвета. Координаты в нашей новой системе координат, у этой точки будут M'(25,-35). Вектор этой точки тоже будет иметь координаты (25,-35).

    Теперь надо решить, как находить вектор, по которому мы будем находить вторую точку. Есть два варианта:
    1. Изменить длину вектора нашей текущей точки так, что-бы она лежала в пределах от 1 до некоторого значения max, которое вы выберите сами, на свой вкус. (Обычно выбирают 8 чтобы использовать сдвиги).
    2. Зафиксировать длину вектора. (Опять же выбор длины остается за вами, а но можно опять выбрать 8).
    Здесь используется второй вариант.
    Вычислим по ней координаты вектора N, округляя до целого: N.x= 4, N.y= -6.
    Тогда координаты искомой точки P будут находиться так: P(x'-N.x,y'-N.y). То есть, P(21,-29).
    Теперь осталось сблюрить точки M и P, и записать получившиеся значение в точку M.
    Осталось рассказать в каком порядке надо обрабатывать точки, чтобы получить правильное, радиально-сблюренное изображение.
    Разобьем экран на четыре сектора:
    Рассмотрим сектор #1:
    [​IMG]
    Обрабатывать пиксели по координате X, надо в порядке: 1,2,3..., а по координате Y, по-строчно, в порядке: A,B,C... .
    По такому же принципу надо поступать и в других секторах: обрабатывать сектор по строкам, начиная с ближней к центру блюра, а в строке тоже двигаться от центра блюра.
    Естественно, линии с координатами центра блюра надо тоже обработать. Ну вот и все, загляните в прилагаемые исходники, что бы посмотреть, как можно прооптимизировать этот эффект.
    Взято здесь, текст программы немного переделан, в результате СОМ-файл уменьшился с 1242 байт до 810 байт
     

    Вложения:

    • rblur.jpg
      rblur.jpg
      Размер файла:
      45,7 КБ
      Просмотров:
      1.172
    • intel.jpg
      intel.jpg
      Размер файла:
      24,3 КБ
      Просмотров:
      1.216
    • I2.gif
      I2.gif
      Размер файла:
      3,2 КБ
      Просмотров:
      1.254
    Последнее редактирование: 24 дек 2016
    >Quiet Snow< нравится это.
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.708
    Код (ASM):
    1. ; masm dos com #
    2. .model tiny
    3. .code
    4. .386
    5. org 100h
    6. WIDTH_SCREEN    equ 320
    7. HEIGHT_SCREEN   equ 200
    8. SCREENSIZE  equ WIDTH_SCREEN*HEIGHT_SCREEN
    9. MEMBLOCKSIZE    equ SCREENSIZE/16
    10. IMPUT_STATUS_0  equ 3DAh    ;регистр статуса ввода 0
    11. VGA_SEGMENT equ 0A000h
    12.  
    13. time        equ dword ptr [bp-4]
    14. n       equ dword ptr [bp-8]
    15. y       equ word ptr [bp-10]
    16. vx      equ word ptr [bp-12]
    17. p1      equ word ptr [bp-14]
    18. screen      equ word ptr [bp-16]
    19. pics        equ word ptr [bp-18]
    20. bbx     equ dword ptr [bp-22]
    21. bby     equ dword ptr [bp-26]
    22.  
    23. start:      mov sp,0DF0h
    24.         mov ah,4Ah      ;ADJUST MEMORY BLOCK SIZE (SETBLOCK)
    25.         mov bx,0DFh     ;ES = segment address of block  to change
    26.         int 21h         ;BX = new size in paragraphs
    27.         enter 26,0
    28.         mov time,0
    29.         mov bx,MEMBLOCKSIZE ;4000
    30.         mov ah,48h      ;ALLOCATE MEMORY
    31.         int 21h         ;BX = number of 16-byte paragraphs desired      
    32.         mov screen,ax       ;screen[64000]
    33.         mov bx,MEMBLOCKSIZE ;4000
    34.                 mov ah,48h      ;ALLOCATE MEMORY
    35.         int 21h         ;BX = number of 16-byte paragraphs desired
    36.         mov pics, ax        ;pics[64000]
    37.         mov bx,MEMBLOCKSIZE*2
    38.                 mov ah,48h      ;ALLOCATE MEMORY
    39.         int 21h         ;BX = number of 16-byte paragraphs desired
    40.         mov es,ax ;es=sqr       sqr[128000]
    41.         mov fs,ax ;fs=sqr
    42.         add ax,4000
    43.         mov gs,ax ;gs=sqr+64000/16
    44.         mov ax,13h
    45.         int 10h    
    46. ;initsqr--------------------------------------
    47.         mov si,WIDTH_SCREEN-1
    48. a0:     mov y,HEIGHT_SCREEN-1
    49. @@:     mov ax,y
    50.         mul ax
    51.         movzx ecx,ax;ecx=y*y
    52.         movsx eax,si
    53.         mul eax
    54.         add eax,ecx;eax=x*x + y*y
    55.         mov n,eax
    56.         fild n
    57.         fsqrt
    58.         fistp n
    59.         mov eax,n;n=sqrt(x*x + y*y)
    60.         shr eax,3
    61.         inc eax
    62.         mov n,eax;n=(sqrt(x*x + y*y))/8 + 1
    63.         imul di,y,WIDTH_SCREEN
    64.         mov ax,si
    65.         add di,ax;di=y*320 + x
    66.         cwd
    67.         idiv word ptr n;ax=x/((sqrt(x*x + y*y))/8 + 1)
    68.         mov gs:[di],al
    69.         mov ax,y
    70.         cwd
    71.         idiv word ptr n;ax=y/((sqrt(x*x + y*y))/8 + 1)
    72.         stosb   ;mov es:[di],al
    73.         dec y
    74.         jns @b
    75.         dec si
    76.         jns a0
    77. ;readbmp-----------------------------------------------------------
    78.         mov dx, offset aIntel_bmp ; "intel.bmp"
    79.         mov ax, 3D00h     ; OPEN DISK FILE WITH HANDLE
    80.         int 21h; DS:DX  -> ASCIZ filename
    81.         mov bx,ax
    82.         xor cx,cx
    83.         mov dx,1078;заголовок и палитра BMP-файла
    84.         mov ax,4200h; MOVE FILE READ/WRITE POINTER (LSEEK)
    85.         int 21h ; AL = method: offset from beginning of file                    
    86.         push    ds
    87.         mov ds, pics
    88.         mov di,HEIGHT_SCREEN-1
    89. @@:     imul    dx,di,WIDTH_SCREEN
    90.         mov cx,WIDTH_SCREEN
    91.         mov ah, 3Fh; READ FROM FILE WITH HANDLE
    92.         int 21h; BX = file handle, CX = number of bytes to read, DS:DX -> buffer
    93.         dec di
    94.         jnz @b
    95.         push    ds
    96.         pop     es;es=pics  di=0
    97.         pop ds
    98.         mov ah, 3Eh; CLOSE A FILE WITH HANDLE
    99.         int 21h; BX = file handle
    100.         mov cx,64000
    101.             inc si;si=0FFFFh+1=0
    102. a1:     lods byte ptr es:[si];c=fgetc(in)
    103.         dec al
    104.         jz  @f
    105.         or  al,-1
    106. @@:     not al
    107.         stosb ;if(c==1)pics[x+320*y]=255 else pics[x+320*y]=0
    108.                 loop    a1
    109. ;blurpics-----------------------------------------------------
    110.         mov di, WIDTH_SCREEN
    111.         mov cx,63040
    112. @@:     movzx   ax, byte ptr es:[di-WIDTH_SCREEN]
    113.         add al, byte ptr es:[di-1]
    114.         adc ah, 0
    115.         add al, byte ptr es:[di+1]
    116.         adc ah, 0
    117.         add al, byte ptr es:[di+WIDTH_SCREEN]
    118.         adc ah, 0
    119.         shr ax, 2
    120.         stosb
    121.         loop    @b
    122. ;setcolortable--------------------------------------------
    123.         mov cx, 255
    124. @@:     mov bl, 255
    125.         sub bl, cl
    126.         shr bl, 2
    127.         mov dx, 3C8h
    128.         mov al, cl;color
    129.                 mov ah, bl;red
    130.         out dx, ax
    131.         inc dx
    132.         mov al,bl;green
    133.         out dx,al
    134.         out dx,al
    135.         dec cx
    136.         jns @b
    137. ;-----------------------------------------------------------
    138. a2: fld time
    139.     fadd    const005
    140.     fst time; time+=0,05
    141.     fmul    const1_1;time*1,1
    142.     fadd    const1_5;time*1,1+1,5
    143.     fsin                      ;sin(time*1,1+1,5)
    144.     fmul    const120;120*sin(time*1,1+1,5)
    145.     fistp   bbx   ;bbx=120*sin(time*1,1+1,5)
    146.     add bbx,WIDTH_SCREEN/2;bbx=160+120*sin(time*1,1+1,5)
    147.     fld time
    148.     fmul    const08;time*0,8
    149.     fadd    const1_1;1,1+time*0,8
    150.     fcos                      ;cos(1,1+time*0,8)
    151.     fmul    const90;90*cos(1,1+time*0,8)
    152.     fistp   bby  ;bby=90*cos(1,1+time*0,8)
    153.     add bby,HEIGHT_SCREEN/2;bby=100+90*cos(1,1+time*0,8)
    154. ;100 и 160 координаты середины экрана
    155. ;copypicsvirtual        
    156.     push ds
    157.     mov ds,pics
    158.     mov es,screen
    159.     xor si,si
    160.     xor di,di
    161.     mov cx,SCREENSIZE/4
    162.     rep movsd
    163.     pop ds
    164. ;radialblurscreen
    165.     xor dx,dx
    166.     mov bx,word ptr bby
    167.     dec bx         ; bx = bby - 1
    168.     imul di,bx,WIDTH_SCREEN; di = (bby - 1)*320
    169.     add di,word ptr bbx; di = (bby - 1)*320 + bbx
    170.     dec di        ; di = (bby - 1)*320 + bbx - 1
    171. a3: mov cx,word ptr bbx
    172. @@: mov ah,0
    173.     mov al,es:[di]
    174.     mov p1,ax
    175.     mov si,dx
    176.     mov al,gs:[si]
    177.     mov vx,ax        ; vx = gs[t]
    178.     lods byte ptr fs:[si]
    179.     imul ax,WIDTH_SCREEN;      ax=320*fs:[t]
    180.     mov si,di
    181.     add si,vx
    182.     add si,ax
    183.     mov ah,0
    184.     lods byte ptr es:[si];movzx ax,byte ptr es:[si]
    185.     add ax,p1
    186.     shr ax,1
    187.     stosb;mov es:[di], al
    188.     dec di
    189.     dec di
    190.     inc dx
    191.     dec cx
    192.     jnz @b
    193.     sub di,WIDTH_SCREEN
    194.     add di,word ptr bbx
    195.     mov ax,WIDTH_SCREEN
    196.     sub ax,word ptr bbx
    197.     add dx,ax
    198.     dec bx
    199.     jns a3
    200.         mov ax,word ptr bby
    201.         dec ax
    202.         imul di,ax,WIDTH_SCREEN
    203.         add di,word ptr bbx
    204.         xor dx,dx
    205.         mov cx,word ptr bby
    206. a4:     mov bx,word ptr bbx
    207. @@:     movzx   ax, byte ptr es:[di]
    208.         mov p1,ax
    209.         mov si,dx
    210.         movzx   ax,byte ptr gs:[si]
    211.         mov vx,ax
    212.         movzx   ax,byte ptr fs:[si]
    213.         imul ax,WIDTH_SCREEN
    214.         mov si, di
    215.         sub si, vx
    216.         add si, ax
    217.         movzx   ax, byte ptr es:[si]
    218.         add ax, p1
    219.         shr ax, 1
    220.         stosb
    221.         inc dx
    222.         inc bx
    223.                 cmp bx,WIDTH_SCREEN
    224.         jl  @b
    225.         sub di,WIDTH_SCREEN*2
    226.         add di,word ptr bbx
    227.         mov ax,word ptr bbx
    228.         add dx,ax
    229.         dec cx
    230.         jnz a4
    231.         mov cx,word ptr bby
    232.         imul di,cx,WIDTH_SCREEN
    233.         add di,word ptr bbx
    234.         dec di
    235.         xor dx,dx
    236. a5:     mov bx,word ptr bbx
    237. @@:     movzx   ax, byte ptr es:[di]
    238.         mov p1,ax
    239.         mov si,dx
    240.         movzx   ax, byte ptr gs:[si]
    241.         mov vx,ax
    242.         movzx   ax, byte ptr fs:[si]
    243.         imul ax,WIDTH_SCREEN
    244.         mov si, di
    245.         add si, vx
    246.         sub si, ax
    247.         movzx   ax, byte ptr es:[si]
    248.         add ax, p1
    249.         shr ax, 1
    250.         stosb;mov   es:[di], al
    251.         dec     di
    252.         dec di
    253.         inc dx
    254.         dec bx
    255.         jnz @b
    256.         add di, WIDTH_SCREEN
    257.         add di,word ptr bbx
    258.         mov ax, WIDTH_SCREEN
    259.         sub ax,word ptr bbx
    260.         add dx,ax
    261.         inc cx
    262.                 cmp cx,HEIGHT_SCREEN
    263.         jl  a5
    264.         mov cx,word ptr bby
    265.         imul    di,cx,WIDTH_SCREEN
    266.         add di,word ptr bbx
    267.         xor dx,dx
    268. a6: mov bx,word ptr bbx
    269. @@:     movzx   ax, byte ptr es:[di]
    270.         mov p1,ax
    271.         mov si,dx; t
    272.         mov ah,0
    273.         mov al,gs:[si]
    274.         mov vx,ax
    275.         lods    byte ptr fs:[si]
    276.         mov dx,si
    277.         imul ax,WIDTH_SCREEN
    278.         mov si, di
    279.         sub si, vx
    280.         sub si, ax
    281.         movzx   ax, byte ptr es:[si]
    282.         add ax, p1
    283.         shr ax, 1
    284.         stosb
    285.         inc bx
    286.                 cmp bx,WIDTH_SCREEN
    287.         jl  @b
    288.         mov ax,word ptr bbx
    289.         add di,ax
    290.         add dx,ax
    291.         inc cx
    292.         cmp cx,HEIGHT_SCREEN
    293.         jl  a6
    294. ;blurscreen --------------------------------------
    295.         mov di, WIDTH_SCREEN
    296.         mov cx,63040
    297. loc_104E7:  movzx   ax, byte ptr es:[di-WIDTH_SCREEN]
    298.         add al, byte ptr es:[di-1]
    299.         adc ah, 0
    300.         add al, byte ptr es:[di+1]
    301.         adc ah, 0
    302.         add al, byte ptr es:[di+WIDTH_SCREEN]
    303.         adc ah, 0
    304.         shr ax, 2
    305.         stosb
    306.         loop    loc_104E7
    307. ;copyvirtualscreen
    308.         mov dx, IMPUT_STATUS_0
    309. WaitVerticalSync:in al,dx
    310.             test al,8
    311.             jz WaitVerticalSync
    312. WaitNotVerticalSync:in al,dx
    313.             test al,8
    314.             jnz WaitNotVerticalSync
    315.         mov cx,SCREENSIZE/4
    316.         xor si,si
    317.         push ds
    318.         push es
    319.         pop ds
    320.         xor di,di
    321.             push VGA_SEGMENT
    322.         pop es
    323.         rep movsd
    324.         xor ax,ax
    325.         mov ds,ax
    326.         mov ax,ds:[41Ah]
    327.         sub ax,ds:[41Ch]
    328.         pop ds
    329.         jz a2
    330. exit:       mov ax,3
    331.         int 10h     ; - VIDEO - SET VIDEO MODE
    332.         int 20h
    333.  
    334. const005    dd 0.05
    335. const08     dd 0.8
    336. const1_1    dd 1.1
    337. const1_5    dd 1.5
    338. const90     dd 90.0
    339. const120    dd 120.0
    340. aIntel_bmp  db 'intel.bmp',0
    341. end start