Optimated Cubemaps

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Black Spider

Betreff: Optimated Cubemaps

BeitragDo, Jan 04, 2007 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jan 10, 2007 0:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jan 10, 2007 1:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group