Code archives/3D Graphics - Effects/Motion blur FX

This code has been declared by its author to be Public Domain code.

Download source code

Motion blur FX by Matt Merkulov
(Posted 20 years ago)
From article: Real-time motion blur FX (rus)
;14 real-time 3D motion blur FX presets by Matt Merkulov

; The size of a structure, number of effect, the order of a portrayal(-1 or 1)
Const texsize=1024, fx=7, o =-1

Graphics3D 800,600,32

cam=CreateCamera()
PositionEntity cam, 0,0,-6
RotateEntity CreateLight(), 45,0,0

; Creation of a stage
cube=CreateCube()
EntityColor cube, 255,128,0
cone1=CreateCone(20)
EntityColor cone1,0,255,255
PositionEntity cone1,-4,0,0
cone2=CreateCone(20)
EntityColor cone2,0,255,0
PositionEntity cone2,4,0,0
p=CreatePivot()
sph=CreateSphere(20, p)
PositionEntity sph, 0,0,-4

Select fx
 Case 1:bl=createblurlayer(cam, 1,0,1,1, .95,1, o)
 Case 2:bl=createblurlayer(cam, 1,0,1, .97,1,3, o)
 Case 3:bl=createblurlayer(cam, 1, .2,1.02, .97,1,3, o)
 Case 4:bl=createblurlayer(cam, 1,0,1.01,1, .95,1, o)
 Case 5
 bl=createblurlayer(cam, 1,0,1.01,1, .9,1, o)
 EntityColor bl, 240,255,225
 Case 6
 bl=createblurlayer(cam, 1.1,0,1,1, .95,1, o)
 RotateEntity bl, 1,1,0
 Case 7
 bl=createblurlayer(cam, 1.01,1,1,1, .9,1, o)
 bl2=createblurlayer(cam, 1.02,-1,1,1, .8,1, o)
End Select

SetBuffer BackBuffer()
While Not KeyHit(1)
 TurnEntity cube, .1, .2, .3
 TurnEntity p, .55, .35, .2
 RenderWorld
 bltex=updateblurlayer(bl, bltex)
 If bl2 Then EntityTexture bl2, bltex
 If fx=4 Then PositionEntity bl, Rnd(-.01, .01), Rnd(-.01, .01), 1
 Flip
Wend

; Function of creation of a layer of the degradation adhered to the chamber - returns the address of a layer
Function createblurlayer(cam, z#, ang#, mgn#, bright#, alpha#, bmode, ord)
Local xres=GraphicsWidth()
Local yres=GraphicsHeight()
layer=CreateMesh(cam)
s=CreateSurface(layer)
; Calculation of coordinates of a structure
vx#= 1.0*xres/texsize
vy#= 1.0*yres/texsize
AddVertex s,-1,-1,0,0,0
AddVertex s, 1,-1,0, vx#, 0
AddVertex s,-1,1,0,0, vy#
AddVertex s, 1,1,0, vx#, vy#
AddTriangle s, 0,1,2
AddTriangle s, 3,2,1
; Definition of sizes for installation of a rectangular directly in front of the chamber by
; Calculations of screen coordinates of a point of the three-dimensional world
PositionEntity layer, 1,1, z#
CameraProject cam, EntityX(layer, True), EntityY(layer, True), EntityZ(layer, True)
rx#= ProjectedX#()-.5*xres
ry#= ProjectedY#()-.5*yres
; Scaling a layer
ScaleMesh layer, .5*xres/rx#,.5*yres/ry#, 1
; Sdlvig a rectangular on polpiksela to the left-upwards that it(he) was in the center of the screen
PositionEntity layer,-.5/rx#,-.5/ry#, z#
RotateEntity layer, 0,0, ang#
; The task of effects of a layer
ScaleEntity layer, mgn#, mgn#, mgn#
EntityAlpha layer, alpha#
EntityBlend layer, bmode
col=255*bright#
EntityColor layer, col, col, col
EntityFX layer, 1
EntityOrder layer, ord
Return layer
End Function

; Function of updating of a layer(returns the address of a structure)
; It is necessary to cause each time after RenderWorld
Function updateblurlayer(layer, tex)
If tex=0 Then tex=CreateTexture(texsize, texsize)
EntityTexture layer, tex
CopyRect 0,0, GraphicsWidth(), GraphicsHeight(), 0,0, BackBuffer(), TextureBuffer(tex)
Return tex
End Function

Comments

ingenium
(Posted 20 years ago)
Nvm

puki
(Posted 20 years ago)
For any beginners confused by this - you select the number of the effect each time you run the program - ie change the value of the Const variable 'fx' at the beginning of the code - then run the program.

EDIT:
However, that value has a range of 1 to 7.

Matt Merkulov
(Posted 20 years ago)
Thanks, this is useful addition, maybe somebody really can be confused.

chwaga
(Posted 20 years ago)
How could I put the code necesarry into an include function, so I could call it in easily as if it were a command later? (I'm a nub at this :D)

Code Archives Forum