Посоветуйте как использовать аппаратное ускорение

Предыдущая тема Следующая тема Перейти вниз

Посоветуйте как использовать аппаратное ускорение

Сообщение  crazyleg в Вт Окт 04, 2011 1:04 pm

Здравствуйте! Помогите новичку!

Задача следующая:

Имеется изображение заданное массивом. Например так f(x,y).

Необходимо по запросу часть этого изображения - квадрат 4х4 пикселей
вывести на экран в четырехугольник, заданный координатами вершин x1y1, x2y2, x3y4, x5y5, который может быть как больше так и меньше исходного фрагмента изображения. Чтобы влезть в заданный четырехугольник изображение соответственно должно растягиваться, сжиматься и искривлятся.

Короче, надо заданное изображение затолкать в заданный четырехугольник.
Я написал алгоритм, но он работает очень медленно. Чувствую, что данную задачу можно решить с помощью аппаратного ускорения, но не знаю как.

Прошу подсказать что-нибудь по этому вопросу. И/или дать ссылку на инфу на русском языке по использованию графических библиотек, но на такую, чтобы там было все разжевано. Я вот даже из примера ничего запустить не могу. Выдает ошибку что какой-то DLL файл не найден. Гугление результатов не дало. Пытался читать учебник NeHe, но пока не разобрался что к чему.

Заранее спасибо!

crazyleg

Сообщения : 9
Дата регистрации : 2011-10-04

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Посоветуйте как использовать аппаратное ускорение

Сообщение  Замабувараев в Вт Окт 04, 2011 6:35 pm

Код примерно таков. Потренируйся с созданием графических режимов и методами выведения буферов на экран (And Or Xor Pset Trans и так далее). Я вставил паузы в код, чтобы было наглядно.
Код:

' Устанавливаем графический режим 640*480
Screen 18, 32, 4, 0

' Первый буфер изображения
Dim Buffer  As Any Ptr = ImageCreate(640, 480)
' Второй буфер изображения
Dim Buffer2 As Any Ptr = ImageCreate(300, 300)

' Заполоняем буфер точками случайного цвета
Dim x As Integer ' координаты точек
Dim y As Integer
For i As Integer = 0 To 10000
    x = RND * 640 '\ 100
    y = RND * 480 '\ 100
    Pset buffer, (x, y), RND*3265600000
Next i

' Рисуем весь буфер изображения на экран
Put (0, 0), Buffer
' Пауза
Sleep(5000)
' Рисуем кусок из первого буфера на втором буфере
Put Buffer2, (340,340),  Buffer, (0,0) - (200, 200)

' Выводим второй буфер на экран
Put (0, 0), Buffer2
' Пауза
Sleep(5000)

' Очистка обязательна
ImageDestroy(Buffer)
ImageDestroy(Buffer2)
avatar
Замабувараев

Сообщения : 99
Дата регистрации : 2008-08-20
Возраст : 33
Откуда : Красноярск

Посмотреть профиль http://www.freebasic.su

Вернуться к началу Перейти вниз

Re: Посоветуйте как использовать аппаратное ускорение

Сообщение  crazyleg в Ср Окт 05, 2011 12:45 am

Спасибо за ответ, но кажется, Вы не поняли что я хочу. Необходимо квадратное изображение вписать в неправильный четырехугольник с соответствующими искажениями исходного изображения. Программу я написал, она работает, но медленно, а скорость для меня критична. Я думаю эта задача сходна с задачей вывода текстуры в 3д графике (хотя в моей программе 3д графики нет), и хочу использовать аппаратное ускорение для этого. Мне кажется задача простая и решается внесколько строк и мне некогда изучать библиотеку опен ГЛ или другую (хотя позже, когда будет время, обязательно займусь этим). Мне нужно готовое решение:
1. имеется небольшое квадратное изображение.
2. имеются координаты вершин неправильного четырехугольника
Необходимо:
1. В четырехугольник вписать изображение, при этом стороны изображения сжать/растянуть так чтобы оно идеально вошло в вышеупомянутый четырехугольник.


Последний раз редактировалось: crazyleg (Ср Окт 05, 2011 2:44 pm), всего редактировалось 1 раз(а)

crazyleg

Сообщения : 9
Дата регистрации : 2011-10-04

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Посоветуйте как использовать аппаратное ускорение

Сообщение  crazyleg в Ср Окт 05, 2011 2:29 pm

Вот моя прога
Спойлер:
Screen 19, 32, 1

Dim stepy As Single
Dim dxup As Single
Dim dxdown As Single
Dim dxleft As Single
Dim dxright As Single
Dim dyleft As Single
Dim dyright As Single
Dim dyup As Single
Dim dydown As Single
Dim As Single lx1,lx2,ly1,ly2

Dim As Single a,b,dydxleft,dydxright,stp
Dim Shared As Single x,y
Dim i As Single
Dim j As single
Dim k As Single

Dim x1 As single
Dim x2 As single
Dim x3 As single
Dim x4 As single

Dim y1 As single
Dim y2 As single
Dim y3 As single
Dim y4 As single

Dim Shared f(1000,1000)As Integer

Declare Sub linia (ByVal x1 As Single, ByVal y1 As Single,ByVal x2 As Single,ByVal y2 As Single)

'создаем исходное изображение
Randomize
For i = 0 To 100
For j = 0 To 100
Pset(i,j),Rnd*4294967295
Next j
Next i

Circle (50,50),20,180000
Circle (50,50),21,180000
Circle (50,50),22,180000
Circle (50,50),40
Circle (50,50),41

'заталкиваем изображение в массив
For i = 0 To 100
For j = 0 To 100
f(i,j)=Point(i,j)
Next j
Next i

Sleep

For k= 0 To 4

'создаем случайный четырехугольник
x1=Rnd*400+50
x2=Rnd*100+x1+50
x4=Rnd*100-50+x1
x3=Rnd*100-50+x2

y1=Rnd*400+50
y2=Rnd*100-50+y1
y3=Rnd*100+50+y2
y4=Rnd*100+50+y1

' рисуем четырехугольник
Line (x1,y1)-(x2,y2)
Line (x2,y2)-(x3,y3)
Line (x3,y3)-(x4,y4)
Line (x4,y4)-(x1,y1)

Sleep


dxup=x2-x1
dxdown=x3-x4
dxleft=x4-x1
dxright=x3-x2

dyup=y2-y1
dydown=y3-y4
dyleft=y4-y1
dyright=y3-y2


stepy=Abs(dyup)
If Abs(dydown)>stepy Then stepy=Abs(dydown)
If Abs(dyleft)>stepy Then stepy=Abs(dyleft)
If Abs(dyright)>stepy Then stepy=Abs(dyright)


dydxleft=dyleft/dxleft
dydxright=dyright/dxright

a=y1-dydxleft*x1
b=y2-dydxright*x2

stp=Abs(dyleft/stepy)+0.001

For j=y1 To y4 Step stp*0.5
lx1=(j-a)/dydxleft
ly1=j
ly2=y2+(j-y1)*dyright/dyleft
lx2=(ly2-b)/dydxright
y=(j-y1)/dyleft*100
linia (lx1,ly1,lx2,ly2)
Next j

Next k
Sleep


Sub linia (ByVal x1 As Single, ByVal y1 As Single,ByVal x2 As Single,ByVal y2 As Single)
Dim As Single dydx,b,stp,i, dx,dy
stp=0.5
dx=x2-x1
dy=y2-y1
If Abs(dy)>Abs(dx) Then stp=Abs(dx/dy)*0.5
If x1>x2 Then Swap x1,x2:Swap y1,y2:dx=-dx:dy=-dy

dydx=dy/dx
b=y1-dydx*x1
If stp=0 Then stp=0.01
For i=x1 To x2 Step stp
x=(i-x1 )/dx*100
Pset (i,b+dydx*i) ,f(x,y)
Next i

End Sub

работает, но медленно.

crazyleg

Сообщения : 9
Дата регистрации : 2011-10-04

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Посоветуйте как использовать аппаратное ускорение

Сообщение  crazyleg в Пн Окт 10, 2011 11:31 am

Блин. Неужели никто не подскажет. Скажите хотя бы как из картинки заданной массивом вида color (x,y) сделать текстуру в openGL.
Спасибо.

crazyleg

Сообщения : 9
Дата регистрации : 2011-10-04

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Посоветуйте как использовать аппаратное ускорение

Сообщение  trew в Пн Окт 10, 2011 5:16 pm

Вот пример из расширенной библиотеки fb-extended-lib :

http://code.google.com/p/fb-extended-lib/

Этот пример поворачивает и увеличивает(уменьшает) изображение правда пропорционально, но поколдуй с исходником.

Код:
''File: rotate.bas
''Description: Demonstration of ext.gfx.Rotate function.
''
''Copyright (c) 2007 FreeBASIC Extended Library Development Group
''
''Distributed under the FreeBASIC Extended Library Group license. (See
''accompanying file LICENSE.txt or copy at
''http://code.google.com/p/fb-extended-lib/wiki/License)
'
#Include once "fbgfx.bi"
#Include "windows.bi"
Sub RotateScale( dst as FB.IMAGE ptr = 0, src as FB.IMAGE ptr, positx as integer, posity as integer, angle as single, SCALE as single )

        #define PixSize uinteger
        #define RegPix eax
        const PI_180 = atn(1)/45
        const cUSEBITS = 20
        const cMULNUMB = 1 shl cUSEBITS
        const cDIVNUMB = 1/cMULNUMB
        const cBITREAL = (1 shl cUSEBITS)-1
        const PixSz = sizeof(PixSize)
        const PixMul = PixSz\2

        static as byte INIT
        static as any ptr STPTR
        static as integer OLDPROT,BLKSZ
        static as integer NX,NY,SX,SY
        static as integer SW2, SH2, SWA,SHA
        static as integer NXTC,NXTS,NYTC,NYTS,NXTCS,NXTSS
        static as integer TC,TS,IMIN,IMAX
        static as any ptr DSTPTR,SRCPTR
        static as integer STARTX,STARTY,ENDX,ENDY,XPUT,YPUT
        static as integer DSTWID,DSTHEI,DSTPIT,DSTEXT
        ' clearing access for selfmodify
        'buffers info
        dim as integer POSX=POSITX,POSY=POSITY
        dim as integer SRCWID = src->width
        dim as integer SRCHEI = src->height
        dim as integer SRCPIT = src->pitch
        dim as single ZOOMX = SCALE, ZOOMY = SCALE

        if INIT=0 then
                asm
                        inc dword ptr [INIT]
                        mov eax,offset _RTZ32_ASM_BEGIN_
                        mov ebx,offset _RTZ32_ASM_END_
                        mov [STPTR],eax
                        sub ebx,eax
                        mov [BLKSZ],ebx
                end asm

                VirtualProtect(STPTR,BLKSZ,PAGE_EXECUTE_READWRITE,@OLDPROT)
        end if

        if dst = 0 then
                dstptr = screenptr
                screeninfo DSTWID,DSTHEI
                DSTPIT = DSTWID*sizeof(PixSize)
        else
                dstptr = cast( any ptr, dst+1):DSTPIT = dst->pitch
                DSTWID = dst->width:DSTHEI = dst->height
        end if

        'quadrant
        var DTMP = ANGLE
        while DTMP < 0: DTMP += 360: wend
        while DTMP > 360: DTMP -= 360: wend
        while DTMP > 90: DTMP -= 90: wend
        ' rotation data
        SRCPTR = cast( PixSize ptr, src+1)
        SW2 = src->width\2: sh2 = src->height\2
        TS = (sin( -angle * pi_180 )*cMULNUMB)/SCALE
        TC = (cos( -angle * pi_180 )*cMULNUMB)/SCALE
        if SH2 > SW2 then SWA = SH2 else SWA = SW2
        SHA = (-int(-SWA*sin(PI_180*(DTMP+45))/sin(PI_180*45)))
        SWA = (-int(-SWA*sin(PI_180*(DTMP+45))/sin(PI_180*45)))
        'SHA=SH2*1.5:SWA=SW2*1.5
        XPUT = SWA*ZOOMX-SW2: YPUT = SHA*ZOOMY-SH2
        POSITX -= SW2: POSITY -= SH2
        STARTX = -XPUT: ENDX = src->width+XPUT
        STARTY = -YPUT: ENDY = src->height+YPUT
        ' clipping
        IMIN = STARTX+POSITX:  if IMIN < 0 then STARTX -= IMIN
        IMAX = ENDX+POSITX: if IMAX >= DSTWID then ENDX += (DSTWID-1)-IMAX
        if IMIN < 0 and IMAX < 0 then exit sub
        if IMIN >= DSTWID and IMAX >= DSTWID then exit sub
        IMIN = STARTY+POSITY:  if IMIN < 0 then STARTY -= IMIN
        IMAX = ENDY+POSITY: if IMAX >= DSTHEI then ENDY += (DSTHEI-1)-IMAX
        if IMIN < 0 and IMAX < 0 then exit sub
        if IMIN >= DSTHEI and IMAX >= DST then exit sub
        ' initial values
        DSTPTR += (STARTY+POSITY)*DSTPIT
        DSTPTR += (STARTX+POSITX)*sizeof(PixSize)
        SX = (ENDX-STARTX)+1: SY = (ENDY-STARTY)+1
        DSTEXT = DSTPIT-SX*sizeof(PixSize)
        NY = (STARTY-SH2): NYTC = NY*TC: NYTS = NY*TS
        NX = (STARTX-SW2): NXTCS = NX*TC: NXTSS = NX*TS
        ' self modifing variables to constants
        asm
                mov eax,[SX]    'SX
                mov [_RTZ32_SX_CONST_1_-2],ax
                mov eax,[SY]    'SY
                mov [_RTZ32_SY_CONST_1_-4],eax
                mov eax,[NXTCS] 'NXTCS
                mov [_RTZ32_NXTCS_CONST_1_-4],eax
                mov eax,[NXTSS] 'NXTSS
                mov [_RTZ32_NXTSS_CONST_1_-4],eax
                mov eax,[SW2]  'SW2
                mov [_RTZ32_SW2_CONST_1_-4],eax
                mov eax,[SH2]  'SH2
                mov [_RTZ32_SH2_CONST_1_-4],eax
                mov eax,[SRCWID] 'SRCWID
                mov [_RTZ32_SRCWID_CONST_1_-4],eax
                mov eax,[SRCHEI] 'SRCHEI
                mov [_RTZ32_SRCHEI_CONST_1_-4],eax
                mov eax,[SRCPTR] 'SRCPTR
                mov [_RTZ32_SRCPTR_CONST_1_-4],eax
                mov eax,[SRCPIT] 'SRCPIT
                mov [_RTZ32_SRCPIT_CONST_1_-4],eax
                mov eax,[DSTEXT] 'DSTEXT
                mov [_RTZ32_DSTEXT_CONST_1_-4],eax
                mov eax,[TC]    'TC
                mov [_RTZ32_TC_CONST_1_-4],eax
                mov [_RTZ32_TC_CONST_2_-4],eax
                mov eax,[TS]    'TS
                mov [_RTZ32_TS_CONST_1_-4],eax
                mov [_RTZ32_TS_CONST_2_-4],eax
        end asm
        #ifdef __FB_WIN32__
        FlushInstructionCache(GetCurrentProcess(),STPTR,BLKSZ)
        #endif

        ' draw rotated/scaled block
        asm
                #define SelfMod 0x8899AABB
                #define SelfMod16 0x88BB
                #define _DSTPTR_ edi
                #define _PY_ ecx
                #define _PX_ cx
                #define _NXTC_ ebx
                #define _NXTS_ edx
                #define _NYTS_ esp
                #define _NYTC_ ebp
                _RTZ32_ASM_BEGIN_:          '\
                mov _DSTPTR_,[DSTPTR]      '|
                mov eax,[NYTS]              '|
                mov ebx,[NYTC]              '| Rotate/zoom
                movd mm0,ebp                '| asm begin
                movd mm1,esp                '|
                mov _NYTS_,eax              '|
                mov _NYTC_,ebx              '/
                mov _PY_,SelfMod          '\
                _RTZ32_SY_CONST_1_:        '|
                shl _PY_,16              '| for PY = SX to 1 step-1
                .balign 8                '|
                _BEGIN_FOR_PY_:          '/
                mov _NXTC_,SelfMod          '\ NXTC=NXTCS: NXTS = NXTSS
                _RTZ32_NXTCS_CONST_1_:      '|
                sub _NXTC_,_NYTS_          '|
                mov _NXTS_,SelfMod          '|
                _RTZ32_NXTSS_CONST_1_:      '|
                add _NXTS_,_NYTC_          '/
                mov _PX_,SelfMod16        '\ for PX = SY to 1 step-1
                _RTZ32_SX_CONST_1_:        '|
                .balign 8                '|
                _BEGIN_FOR_PX_:          '/
                'mov byte ptr [_DSTPTR_],255
                mov esi,_NXTC_              '\
                sar esi,cUSEBITS            '| MX = ((NXTC-NYTS) shr cUSEBITS) + SW2
                adc esi,SelfMod            '|
                _RTZ32_SW2_CONST_1_:        '/
                js _SKIP_IF_1_            '\
                cmp esi,SelfMod          '| if MX>=0 and MX<SRCWID then
                _RTZ32_SRCWID_CONST_1_:    '|
                jge _SKIP_IF_1_          '|
                shl esi,PixMul              '\
                add esi,SelfMod            '| OFFS = MX+SRCPTR
                _RTZ32_SRCPTR_CONST_1_:      '/
                mov eax,_NXTS_            '\
                sar eax, cUSEBITS        '| MY = ((NYTC+NXTS) shr cUSEBITS) + SH2
                adc eax, SelfMod          '|
                _RTZ32_SH2_CONST_1_:      '/
                js _SKIP_IF_1_              '\
                cmp eax,SelfMod            '| if MY>=0 and MY<SRCHEI then
                _RTZ32_SRCHEI_CONST_1_:      '|
                jge _SKIP_IF_1_            '/
                imul eax,SelfMod          '\
                _RTZ32_SRCPIT_CONST_1_:    '|
                add esi,eax              '| col = *cast(PixSize ptr, SRCPTR+MY*SRCPIT+MX)
                mov RegPix,[esi]          '/
                'or al,al                    '\ 'if col<>RGB(255,0,255) then
                'jz _SKIP_IF_1_              '/
                mov [_DSTPTR_],RegPix      '> *cast(PixSize ptr, DSTPTR) = COL
                .balign 2                  '> end if
                _SKIP_IF_1_:              '/ end if:end if
                add _DSTPTR_,PixSz          'DSTPTR += sizeof(PixSize)
                add _NXTC_,SelfMod        '\ NXTC += TC: NXTS += TS
                _RTZ32_TC_CONST_1_:        '|
                add _NXTS_,SelfMod        '|
                _RTZ32_TS_CONST_1_:        '/
                dec _PX_                    '\ next PX
                jnz _BEGIN_FOR_PX_          '/
                add _DSTPTR_,SelfMod      '\ DSTPTR += DSTEXT
                _RTZ32_DSTEXT_CONST_1_:    '/
                add _NYTC_,SelfMod          '\
                _RTZ32_TC_CONST_2_:          '|NYTC += TC: NYTS += TS
                add _NYTS_,SelfMod          '|
                _RTZ32_TS_CONST_2_:          '/
                sub _PY_,(1 shl 16)      '\ next PY
                jnz _BEGIN_FOR_PY_        '/
                movd ebp,mm0                '\
                movd esp,mm1                '| Rotate/Zoom
                emms                        '| Asm End
                _RTZ32_ASM_END_:            '/
        end asm
end Sub

screenres 320, 240, 32
Dim as Any Ptr original=ImageCreate(300,200)
BLoad("2.bmp",original)
If original=0 Then end
Dim As Single angle = 1.0,rot=0
'Line original, (0,0)-(100,100),&hff,BF
do while not multikey(FB.SC_ESCAPE)

   screenlock
   Cls
   
    'ext.gfx.Rotate(0, original, 160-original->width\2, 120-original->height\2, angle)
    RotateScale( , original, 100, 100, rot,angle )
   screenunlock

   if multikey(FB.SC_RIGHT) then rot+=3
   if multikey(FB.SC_LEFT) then rot-=3
   if multikey(FB.SC_UP) then angle += 0.01
   if multikey(FB.SC_DOWN) then angle -= 0.01

   if angle < 0.05 then angle = 0.05
   if angle > 30 then angle = 30
   If rot=361 Then rot=1
   If rot=-1 Then rot=359

   sleep 1,1

loop

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Посоветуйте как использовать аппаратное ускорение

Сообщение  crazyleg в Вт Окт 11, 2011 1:04 pm

Спасибо, но я уже решил проблему в opengl. Если интересует поделюсь решением.


Теперь вот думаю, как в openGL реализовать аналог функции point (x,y)

crazyleg

Сообщения : 9
Дата регистрации : 2011-10-04

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Посоветуйте как использовать аппаратное ускорение

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения