Mein simpler Radiosity Renderer
Übersicht

KrümelBetreff: Mein simpler Radiosity Renderer |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das gefällt mir recht gut, aber dennoch sehen die Ergebnisse etwas sehr verschwommen aus.
Sonst sehr schön ![]() |
||
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 ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
FWeinbehemals "ich" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group