Mein simpler Radiosity Renderer

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Krümel

Betreff: Mein simpler Radiosity Renderer

BeitragSo, Mai 06, 2007 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wer einen schnellen Rechner oder viel Geduld (oder zuviel Zeit) hat, kann dieses Programm mal testen.

Kurze Erklärung:
Von einem Punkt aus werden Strahlen Spalten und Zeilenweise in die Scene "geschossen", treffen sie auf ein Objekt wird eine Kamera an dem Kollisionspunkt positioniert, welche in Richtung der Kollisionsnormalen blickt.
Jetzt wird das Bild der Kamera mit Renderworld gerendert und
die Farbwerte des Bildes ermittelt. der Duchnittswert der Farben
ergibt den Fabwert der entsprechenden Spalte/Zeile

Code: [AUSKLAPPEN]

Const grw=640,grh=480
Graphics3D grw,grh,16,2
SetBuffer BackBuffer()

Global viewCam=CreatePivot()
PositionEntity viewCam,0,0,0
TurnEntity viewCam,0,0,0

Const  RayCount=300
Const  RenderCamX=256
Global RenderImg=CreateImage(RenderCamX,RenderCamX)
Global Picture=CreateImage(grw,grh)
Global pr#,pg#,pb#

Type entity
   Field ent
   Field r#,g#,b#
End Type

Dim shade#(RenderCamX,RenderCamX)
cc=RenderCamX/2
For y=-cc To cc-1
For x=-cc To cc-1
   lg#=Sqr(x*x+y*y)
   If lg<cc Then shade(x+cc,y+cc)=(1.0-(lg/cc))*6.0
Next
Next
;================================================================================================
Function Ray(x1#,y1#,z1#, x2#,y2#,z2#)
   If LinePick (x1,y1,z1,  x2-x1,y2-y1,z2-z1) = 0 Return

   For ee.entity=Each entity
      If ee\ent = PickedEntity() Then
         PositionEntity RenderCam,PickedX(),PickedY(),PickedZ()
         AlignToVector  RenderCam,PickedNX(),PickedNY(),PickedNZ(),3
         RenderWorld
         LockBuffer BackBuffer()   
         For cnt=0 To RayCount-1         
            cx=Rand(0,RenderCamX-1)
            cy=Rand(0,RenderCamX-1)            
            s#=shade(cx,cy)
            
            If s<>0
               col=ReadPixelFast(cx,cy,BackBuffer())
                                          
               pr=pr+((col Shr 16) And 255) * s
               pg=pg+((col Shr  8) And 255) * s
               pb=pb+((col       ) And 255) * s
               
            EndIf
         Next   
         UnlockBuffer BackBuffer()
         lx#=PickedX()-x1
         ly#=PickedY()-y1
         lz#=PickedZ()-z1
         lg#=2000/(lx*lx+ly*ly+lz*lz)
         
         pr=(ee\r + (pr/cnt)) * lg
         pg=(ee\g + (pg/cnt)) * lg
         pb=(ee\b + (pb/cnt)) * lg
         
         Exit
      EndIf
   Next
End Function
;================================================================================================
Function add_sphere.entity(x#,y#,z# ,rad#, r,g,b)
   e.entity=New entity
   e\ent=CreateSphere()
   e\r=r : e\g=g :   e\b=b      
   EntityPickMode e\ent,1
   PositionEntity e\ent,x,y,z
   EntityColor e\ent,r,g,b
   EntityRadius e\ent,rad
   ScaleEntity e\ent,rad,rad,rad
   Return e
End Function
Function add_cube.entity(x#,y#,z# ,xs#,ys#,zs#, r,g,b,  flip_)
   e.entity=New entity
   e\ent=CreateCube()
   e\r=r : e\g=g :   e\b=b
   If flip_=1 Then
      FlipMesh e\ent
      EntityPickMode e\ent,2
   Else
      EntityPickMode e\ent,3
   EndIf   
   EntityColor e\ent,r,g,b
   ScaleEntity e\ent,xs,ys,zs
   EntityBox e\ent,-xs,-ys,-zs,xs*2,ys*2,zs*2
   PositionEntity e\ent,x,y,z   
   Return e
End Function
;================================================================================================
;================================================================================================
e1.entity=add_cube(0,0,20, 7,10,7, 15,15,15 , 1)
e1.entity=add_cube(0, 10,20, 2,0.2,2, 500,500,500 , 0)
e1.entity=add_cube(-7,0,20, 0.05,10,7, 20,0,0 , 0)
e1.entity=add_cube( 7,0,20, 0.05,10,7, 0,20,5 , 0)
e1.entity=add_cube( 3,-3,22, 2,7,2, 15,15,15 , 0) : TurnEntity e1\ent,0,-30,0
e1.entity=add_cube(-3,-6,17, 2,4,2, 10,10,1 , 0) : TurnEntity e1\ent,0, 30,0
s1.entity=add_sphere( 3,-7.5,17, 2.5, 10,3,1)

Global RenderCam=CreateCamera(viewCam):EntityParent RenderCam,0
CameraRange RenderCam,0.01,500
CameraViewport RenderCam, 0,0,RenderCamX,RenderCamX

For y=-grh*0.5 To grh*0.5-1 Step 1
For x=-grw*0.5 To grw*0.5-1 Step 1
   pr=0:pg=0:pb=0
   TFormPoint x,-y,grw*0.5,ViewCam,0
     Ray (EntityX(ViewCam),EntityY(ViewCam),EntityZ(ViewCam), TFormedX(),TFormedY(),TFormedZ())
   If pr>255 Then pr=255
   If pg>255 Then pg=255
   If pb>255 Then pb=255
   WritePixel x+grw*0.5,y+grh*0.5,pr Shl 16 + pg Shl 8 + pb, ImageBuffer(Picture)
Next
   Cls:DrawImage Picture,0,0:Flip
   If KeyHit(1) Then Exit
Next
SaveImage Picture,"C:\_Output_.bmp"

WaitKey():End

StepTiger

BeitragSo, Mai 06, 2007 22:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Das gefällt mir recht gut, aber dennoch sehen die Ergebnisse etwas sehr verschwommen aus.

Sonst sehr schön Wink
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Krümel

BeitragMo, Mai 07, 2007 7:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah, ja das habe ich vergessen:
mit der Variablen "RayCount" kann man bestimmen, wieviele Pixel in die Berechnung des Durchnittsfarbwertes mit einbezogen werden.
Ein höherer Wert (z.B. 1000) führt zu einem schöneren Renderergebnis, dafür dauert das Rendern aber auch (noch) länger.
 

FWeinb

ehemals "ich"

BeitragMo, Mai 07, 2007 15:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht super aus also bei mir brauch der 114 Sec um ein Bild zu generiehen (habe mir mal schnell nen Zeit messer gebaut ^^)

Also sieht super aus aber leider ist es noch nicht schnell genu würde es ne Methode geben die das ganze Beschleuninegen würde ?? ist schon hammer Geil

[Edit]
Wenn mann WirtePixelFast nimmt ist er nen Paar sec schneller nur noch 94 sec bei mir ^^
"Wenn die Menschen nur über das sprächen, was sie begreifen, dann würde es sehr still auf der Welt sein." Albert Einstein (1879-1955)
"If you live each day as if it was your last, someday you'll most certainly be right." Steve Jobs

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group