Посоветуйте как использовать аппаратное ускорение
Участников: 3
Страница 1 из 1
Посоветуйте как использовать аппаратное ускорение
Здравствуйте! Помогите новичку!
Задача следующая:
Имеется изображение заданное массивом. Например так f(x,y).
Необходимо по запросу часть этого изображения - квадрат 4х4 пикселей
вывести на экран в четырехугольник, заданный координатами вершин x1y1, x2y2, x3y4, x5y5, который может быть как больше так и меньше исходного фрагмента изображения. Чтобы влезть в заданный четырехугольник изображение соответственно должно растягиваться, сжиматься и искривлятся.
Короче, надо заданное изображение затолкать в заданный четырехугольник.
Я написал алгоритм, но он работает очень медленно. Чувствую, что данную задачу можно решить с помощью аппаратного ускорения, но не знаю как.
Прошу подсказать что-нибудь по этому вопросу. И/или дать ссылку на инфу на русском языке по использованию графических библиотек, но на такую, чтобы там было все разжевано. Я вот даже из примера ничего запустить не могу. Выдает ошибку что какой-то DLL файл не найден. Гугление результатов не дало. Пытался читать учебник NeHe, но пока не разобрался что к чему.
Заранее спасибо!
Задача следующая:
Имеется изображение заданное массивом. Например так f(x,y).
Необходимо по запросу часть этого изображения - квадрат 4х4 пикселей
вывести на экран в четырехугольник, заданный координатами вершин x1y1, x2y2, x3y4, x5y5, который может быть как больше так и меньше исходного фрагмента изображения. Чтобы влезть в заданный четырехугольник изображение соответственно должно растягиваться, сжиматься и искривлятся.
Короче, надо заданное изображение затолкать в заданный четырехугольник.
Я написал алгоритм, но он работает очень медленно. Чувствую, что данную задачу можно решить с помощью аппаратного ускорения, но не знаю как.
Прошу подсказать что-нибудь по этому вопросу. И/или дать ссылку на инфу на русском языке по использованию графических библиотек, но на такую, чтобы там было все разжевано. Я вот даже из примера ничего запустить не могу. Выдает ошибку что какой-то DLL файл не найден. Гугление результатов не дало. Пытался читать учебник NeHe, но пока не разобрался что к чему.
Заранее спасибо!
crazyleg- Сообщения : 9
Дата регистрации : 2011-10-04
Re: Посоветуйте как использовать аппаратное ускорение
Код примерно таков. Потренируйся с созданием графических режимов и методами выведения буферов на экран (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)
Re: Посоветуйте как использовать аппаратное ускорение
Спасибо за ответ, но кажется, Вы не поняли что я хочу. Необходимо квадратное изображение вписать в неправильный четырехугольник с соответствующими искажениями исходного изображения. Программу я написал, она работает, но медленно, а скорость для меня критична. Я думаю эта задача сходна с задачей вывода текстуры в 3д графике (хотя в моей программе 3д графики нет), и хочу использовать аппаратное ускорение для этого. Мне кажется задача простая и решается внесколько строк и мне некогда изучать библиотеку опен ГЛ или другую (хотя позже, когда будет время, обязательно займусь этим). Мне нужно готовое решение:
1. имеется небольшое квадратное изображение.
2. имеются координаты вершин неправильного четырехугольника
Необходимо:
1. В четырехугольник вписать изображение, при этом стороны изображения сжать/растянуть так чтобы оно идеально вошло в вышеупомянутый четырехугольник.
1. имеется небольшое квадратное изображение.
2. имеются координаты вершин неправильного четырехугольника
Необходимо:
1. В четырехугольник вписать изображение, при этом стороны изображения сжать/растянуть так чтобы оно идеально вошло в вышеупомянутый четырехугольник.
Последний раз редактировалось: crazyleg (Ср Окт 05, 2011 2:44 pm), всего редактировалось 1 раз(а)
crazyleg- Сообщения : 9
Дата регистрации : 2011-10-04
Re: Посоветуйте как использовать аппаратное ускорение
Вот моя прога
работает, но медленно.
- Спойлер:
- 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: Посоветуйте как использовать аппаратное ускорение
Блин. Неужели никто не подскажет. Скажите хотя бы как из картинки заданной массивом вида color (x,y) сделать текстуру в openGL.
Спасибо.
Спасибо.
crazyleg- Сообщения : 9
Дата регистрации : 2011-10-04
Re: Посоветуйте как использовать аппаратное ускорение
Вот пример из расширенной библиотеки fb-extended-lib :
http://code.google.com/p/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: Посоветуйте как использовать аппаратное ускорение
Спасибо, но я уже решил проблему в opengl. Если интересует поделюсь решением.
Теперь вот думаю, как в openGL реализовать аналог функции point (x,y)
Теперь вот думаю, как в openGL реализовать аналог функции point (x,y)
crazyleg- Сообщения : 9
Дата регистрации : 2011-10-04
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|