forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Рябь на воде (http://forum.boolean.name/showthread.php?t=15229)

xmarat 03.08.2011 00:39

Рябь на воде
 
Хочу сделать функцию для создания эффекта ряби на воде. Думаю смотреть надо в сторону pixmap'ов. Как вы считаете стоит ли ее создавать, или такая функция нагрузит процессор? Так же буду рад помощи в создании этой функции...

PHP код:

Type Effect
    Field x
%, y%, r%, t%, rnx%, rny%, timer%
    
Field myi%,myj% = 0
    Field mypm1
:TPixmap,mypm2:TPixmap
    Field myimg
:TImage
    Method Draw
()
        
mypm1=CreatePixmap(r*2,r*2,PF_RGBA88884)
        
mypm2=CreatePixmap(r*2,r*2,PF_RGBA88884)
        
mypm1=GrabPixmap(x-r,y-r,r*2,r*2)
        For 
myi=0 To r*2-1
            
For myj=0 To r*2-1
                rnx
=10-Rand(5)
                
rny=10-Rand(5)
                If 
myi+rnx>r*2-1 Then rnx=0
                
If myj+rnx>r*2-1 Then rnx=0
                
If myi+rnx<0 Then rnx=0
                
If myj+rnx<0 Then rnx=0
                
                
If myi+rny>r*2-1 Then rny=0
                
If myj+rny>r*2-1 Then rny=0
                
If myi+rny<0 Then rny=0
                
If myj+rny<0 Then rny=0
                mypm2
.WritePixel(myi,myj,mypm1.ReadPixel(myi+rnx,myj+rny))
            
Next
        Next
        DrawPixmap mypm2
x-r+5y-r+5
    EndMethod
    
Function Create(x%,y%,r%,t%)
        
Local NewEffect:Effect = New Effect
        NewEffect
.x=x
        NewEffect
.y=y
        NewEffect
.r=r
        NewEffect
.timer=MilliSecs()
        
NewEffect.t=t
        EffectList
.AddLast NewEffect
    EndFunction
    Method destroy
()
        
EffectList.remove(Self)
    
EndMethod
EndType 

Эффект конечно требует доработки, а так же начинает поддтормаживать при радиусе больше 64 пикселей...

Nex 03.08.2011 00:48

Ответ: Рябь на воде
 
Че за нахер?

xmarat 03.08.2011 00:54

Ответ: Рябь на воде
 
Зачем сразу нахер? Просто предлагаю написать функцию...

Reizel 03.08.2011 00:54

Ответ: Рябь на воде
 
пиксмапы на блицмаксе это медленно, хотя если научишься шустро менять пиксели на картинке over 256x256, обязательно отпишись)

xmarat 03.08.2011 01:01

Ответ: Рябь на воде
 
Ну я думал если получится сюда выложить. Буду постепенно менять первое сообщение, поправляйте если что...

Черный крыс 06.08.2011 15:53

Ответ: Рябь на воде
 
Пиксмапы хранятся в ОЗУ, поэтому будет очень медленно.
ОЗУ->Перегонка данных пиксмапа по шине в видяху->Билд пиксмапа в видеопамяти в текстуру OpenGL\DirectX - вот такая получается длинная дорожка.

Думаю тебе известно что GAPI хранит текстуры в видеопамяти - это копии пиксмапов переведенные в формат графической библиотеки, и именно от них надо плясать, нет ничего сложного чтобы прочесть\записать данные напрямую в видеопамяти.

БлицМакс хранит текстуры здесь :
Код:

image.Frame(frame).name
Это адрес в видеопамяти но напрямую обращатся к нему нельзя доступ к текстуре обеспечивает графическая библиотека что то наподобии этого :

Код:

Local frame:TD3D7ImageFrame = TD3D7ImageFrame(image.Frame(0))
Local pixels:Byte Ptr = MemAlloc(16*16*driver.GetPitch(frame.name))
driver.Lock(frame.name, D3D_READONLY)
driver.Read([0, 0, 16, 16], frame.name, Varptr pixels[0])
driver.UnLock(frame.name)

Предупреждаю - это псевдокод, поэтому надо разбиратся - но общая картина такова.

А вообще Анимированая текстура - тру_решение.

Reizel 07.08.2011 10:24

Ответ: Рябь на воде
 
СПасибо, надо будет порыть в этом направлении..
+ ему не нужно анимированной текстуры - он просто хочет динамически прогонять эффекты по пиксмапе, тут анимированных картинок не хватит)))


Часовой пояс GMT +4, время: 23:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot