Optimated Cubemaps
Übersicht

![]() |
Black SpiderBetreff: Optimated Cubemaps |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Leute,
Cubemaps sind, so sollte jedem bekannt sein, für Echtzeitreflektionen gedacht. Eine Cubemap funktion sieht üblicherweise (bei allen 6 Seiten) so aus: http://www.blitzbase.de/befehle3d/setcubeface.htm nun benutzt diese Funktion allerdings 6mal Renderworld, und das zusätzlich, in jedem Schleifendurchlauf, was extrem Performance zieht und deshalb bei so manchen Grafikkarten eine echtzeit-ruckel-reflektion ergibt. Also, jetzt komme ich ^^; Der Code unten ist eine möglichkeit Cubemapping zu verwenden, bei allen 6 Seiten mit nur 1 mal Renderworld; dies Funktioniert wie folgt: Pro schleifendurchlauf wird nur eine Seite gerendert, Vorteil: Programm wird deutlich schneller Nachteil: die Cubemap dagegen langsamer, was aber nicht wirklich auffällt. aber seht selbst: Code: [AUSKLAPPEN] ;Funktionen und der Type
Type CM Field tex Field cc Field obj Field F_Not%, F_Not2%, F_Not3% Field face End Type Function Add_Opt_Cubemap(obj,res%,F1=-1,F2=-1,F3=-1) ;erstellt die Cubemap, inklusive Kamera und allem Pi Pa Po... opt.CM = New CM opt\tex = CreateTexture(res%,res%,1+128+256) opt\cc = CreateCamera() opt\obj = obj ;hier wird jetzt festgelegt, welche Seiten überhaupt spiegeln sollen, maximal 3 Seiten! opt\F_Not% =F1 opt\F_Not2% =F2 opt\F_Not3% =F3 opt\face= 0 ;und nun nur noch die Kamera verstecken und Texturieren CameraProjMode opt\cc,0 EntityTexture opt\obj,opt\tex,0,0 End Function Function Update_Opt_Cubemap() ;6tel Cubemap, verlangsamt die Cubemap, braucht aber nur einmal Renderworld For opt.CM = Each CM opt\face = (opt\face + 1) Mod 6;Pro schleifendurchlauf wird eine andere Seite gerendert ;d.h. jeden 6. Durchlauf wurden alle seiten gerendert und auf die Textur übertragen CameraProjMode opt\cc,1 PositionEntity opt\cc,EntityX#(opt\obj),EntityY#(opt\obj),EntityZ#(opt\obj) HideEntity opt\obj CameraClsMode opt\cc,0,1 CameraViewport opt\cc,0,0,TextureWidth(opt\tex),TextureHeight(opt\tex) ;jetzt wird geprüft, ob die Flächen überhaupt berechnet werden sollen ;+ die Kamera wird ausgerichtet SetCubeFace opt\tex,opt\face Select opt\face Case 0:RotateEntity opt\cc,0,90,0 Case 1:RotateEntity opt\cc,0,0,0 Case 2:RotateEntity opt\cc,0,-90,0 Case 3:RotateEntity opt\cc,0,180,0 Case 4:RotateEntity opt\cc,-90,0,0 Case 5:RotateEntity opt\cc,90,0,0 End Select If Not(opt\face=opt\F_Not Or opt\face=opt\F_Not2 Or opt\face=opt\F_Not3) Then RenderWorld CopyRect 0,0,TextureWidth(opt\tex),TextureHeight(opt\tex),0,0,BackBuffer(),TextureBuffer(opt\tex) End If ShowEntity opt\obj CameraProjMode opt\cc,0 Next End Function ;*********************+ Testebene +**************************** Init_Graphics() Global cam=CreateCamera() CameraClsColor cam,0,128,255 CameraRange cam,1,1000 OBJ = CreateCube() MoveEntity OBJ,0,0,10 OBJ2 = CreateSphere() MoveEntity OBJ2,7,7,10 EntityFX OBJ2,1 OBJ3 = CreateCube() MoveEntity OBJ3,-7,7,10 ;ein paar Würfel W = CreateCube() PositionEntity W,-7,0,10 EntityColor W,255,0,0 W2 = CreateCube() PositionEntity W2,7,0,8 EntityColor W2,0,255,0 W3 = CreateCube() PositionEntity W3,0,7,12 EntityColor W3,255,255,0 W4 = CreateCube() PositionEntity W4,0,0,0 EntityColor W4,255,0,255 W5 = CreateCube() PositionEntity W5,7,0,0 EntityColor W5,0,255,0 W6 = CreateCube() PositionEntity W6,-7,0,0 EntityColor W6,255,0,0 W7 = CreateCube() PositionEntity W7,-7,4,5 EntityColor W7,255,0,0 EntityFX W,1 EntityFX W2,1 EntityFX W3,1 EntityFX W4,1 EntityFX W5,1 EntityFX W6,1 lit = CreateLight(1) TurnEntity lit,45,0,0 AmbientLight 50,50,50 Add_Opt_Cubemap(OBJ,512) Add_Opt_Cubemap(OBJ2,512) Add_Opt_Cubemap(OBJ3,512) While Not(KeyHit(1)) TurnEntity cam,MouseYSpeed()/3,-MouseXSpeed()/3,0 TurnEntity OBJ,.1,.5,.1 TurnEntity OBJ3,1,.1,.2 WireFrame KeyDown(17) Update_Opt_Cubemap() RenderWorld Flip Wend End Function Init_Graphics() Graphics3D 1024,768,32,1 SetBuffer BackBuffer() HidePointer() MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 End Function man kann zig hochauflösende Cubemaps sehr einfach berechnen mit dieser Funktion; erklärung was was ist: Add_Opt_Cubemap(obj,res%,F1,F2,F3): Erstellt eine "optimale" Cubemap für 1 Objekt (obj), res% gibt die auflösung der Textur an und F1-F3 sind Flächen die nicht gerendert werden sollen (optional) , bei -1 passiert nichts, ansonsten werden die Zahlen angegeben, die SetCubeFace überspringen soll. Der Code ist in alle richtungen erweiter-/ausbaubar, und ich werde noch weitere Varianten posten, Cubemaps zu "optimieren". Kommentare erwünscht! |
||
Coming soon:
http://img132.imageshack.us/im...im2ab6.gif |
Krümel |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Gute Idee, da muss man erstmal drauf kommen !
Aber anscheinend werden die Maps in einigen Fällen nicht richtig erstellt, so dass z.B. der rote Würfel in einer ihm abgewandten Fläche gespiegelt wird. |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Die wichtigste Optimierung für Cubemap Reflektionen fehlt da eigentlich:
Der Spieler wird sich in 99.9% der Fälle nicht so schnell bewegen, dass man überhaupt jedes Frame aktualisieren müsste, denn in 16ms passiert meist nicht viel, so das man bei der stark reduzierten Auflösung einer CM keinen Unterschied erkennt. Wenn du von daher noch eine Frequenz einbaust und nur nach 1000/frequenz ms updatest, dann holst du extrem viel Performance raus. (diese Programmierweise *timed programming* würde ich übrigens für alle Effekte empfehlen) Allerdings sehe ich da keine Optimierungen ansonsten: Pro Cubemap Seite hast du 1 Renderworld. Inwiefern unterscheidet sich das vom Source des Castle Demos das mit Blitz3D kommt? Ausser das bei dir die optionale Möglichkeit besteht bis zu 3 Faces nicht zu rendern, was jedoch nix bringen wird in den meisten Fällen da man auch Flächen des Objektes sieht die leicht nach unten / zur Seite geneigt sind. Damit kann normalerweise bestenfalls eine Fläche weg rationalisiert werden (hinten bzw. bei Autos unten) und selbst die nicht immer (kugel zb) |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group