FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

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

Участников: 3

Перейти вниз

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

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

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

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

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

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

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

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

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

crazyleg

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

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

Посоветуйте как использовать аппаратное ускорение Empty 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)
Замабувараев
Замабувараев

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

http://www.freebasic.su

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

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

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

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


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

crazyleg

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

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

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

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

Вот моя прога
Спойлер:

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

crazyleg

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

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

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

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

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

crazyleg

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

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

Посоветуйте как использовать аппаратное ускорение Empty 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

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

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

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

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


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

crazyleg

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

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

Вернуться к началу

- Похожие темы

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