| |
|
|
Sven Bader | Mit dem Accumulation Buffer lassen sich ganz nette Sachen realisieren, wie zum Beispiel eine Bewegungsunschärfe.
Die Idee dahinter ist, dass man mehrere Frames in einem zusammenfasst. Gibt es keine Bewegung, so merkt man keinen Unterschied ansonsten sieht man, wie die bewegten Objekte Schlieren ziehen.
In meinem Beispiel erhöht sich die Anzahl der zusammengefassten Bilder mit der Geschwindigkeit und es wird zusätzlich noch eine kleine Abweichung eingebaut, um den Effekt zu verstärken.
Ohne Accum Buffer (oder Stillstand)
Mit Accum Buffer
Mit Accum Buffer + Schütteleffekt (dx!, dy!, dz!)
$H windows.ph
declare xrot!, yrot!, zrot!
declare xpos!, xspeed!, ypos!, yspeed!, zpos!, zspeed!
proc DrawGLScene
parameters dx!, dy!, dz!
declare id&
ogl("glClear",~GL_DEPTH_BUFFER_BIT | ~GL_COLOR_BUFFER_BIT)'ogl("clear") cleared zu viel!
oGL("Color", 0.7,0.7,0.7,1)
oGL("Origin", xpos!+dx!*0.1, ypos!+dy!*0.1, zpos!+dz!*0.1)
oGL("Rotate", xrot!, yrot!, zrot!)
oGL("Move", 0, -1, 0)
oGL("Texture", tex&, 1)
oGL("Cylinder", 1, 1, 2, 24)
oGL("Texture",tex2&, 8)
oGL("Origin", 0, -10, -24)
oGL("Quad", 29, 20)
xrot! = xrot! + xspeed!
yrot! = yrot! + yspeed!
zrot! = zrot! + zspeed!
endproc
proc Redraw
declare i%, max!, dx!, dy!, dz!
dx! = 1.0
dy! = 1.0
dz! = -1.0
ogl("Clear")
ogl("Push")
max! = if(abs(yspeed!) > abs(xspeed!), if(abs(yspeed!) > abs(zspeed!), abs(yspeed!), abs(zspeed!)), abs(xspeed!)) * 0.75
max! = round(max!, 0)
case max! <= 1 : max! = 1
case max! > 10 : max! = 10
ogl("glClear",~GL_ACCUM_BUFFER_BIT)
whileloop 0, max!-1
DrawGLScene(dx! * &loop, dy! * &loop, dz! * &loop)
ogl("glAccum",~GL_ACCUM, 1.0 / max!)
endwhile
ogl("glAccum",~GL_RETURN, 1.0)
ogl("Pop")
~SwapBuffers(%hDC)'Ersetzt show!!
endproc
' Hauptprogramm
' -------------
declare hWnd&, ende%, hpic&,tex&,tex2&
CLS 0
oGL("Init", %hWnd, 1, 1, 1, 0)
'Texture aus Icons
Mcls 32,32
startpaint -1
DrawIcon "A", 0,0
endpaint
hPic&=create("hPic",0,"&MEMBMP")
tex&=ogl("getTextureBmp",hPic&,1)
DeleteObject hPic&
'Texture aus Icons
startpaint -1
DrawIcon "KNOPF1", 0,0
endpaint
hPic&=create("hPic",0,"&MEMBMP")
tex2&=ogl("getTextureBmp",hPic&,1)
DeleteObject hPic&
xpos! = 0
ypos! = 0
zpos! = -5
xrot! = 35
yrot! = 55
zrot! = 0
xspeed! = 0
yspeed! = 0
zspeed! = 0
Ende% = 0
setTimer 10' max. 50 Frames /sek.
WhileNot ende%
WaitInput
If IsKey(27)
Ende% = 1
ElseIf Iskey(39)
yspeed! = yspeed! + .02
ElseIf Iskey(37)
yspeed! = yspeed! - .02
ElseIf Iskey(40)
xspeed! = xspeed! + .02
ElseIf Iskey(38)
xspeed! = xspeed! - .02
ElseIf Iskey(33)
zpos! = zpos! - .1
ElseIf Iskey(65)
xpos! = xpos! - .1
ElseIf Iskey(68)
xpos! = xpos! + .1
elseIf Iskey(83)
ypos! = ypos! - .1
ElseIf Iskey(87)
ypos! = ypos! + .1
ElseIf Iskey(34)
zpos! = zpos! + .1
EndIf
redraw()
EndWhile
killTimer
end
|
|
|
| |
|
|