Ein Paar Fragen

Previous topic - Next topic

Sebe

1. Wie genau behandelt man 3D Objekte? In der Hilfe steht immer: "Das nächste Objekt..." Wäre es nicht sinnvoller, wenn man bei den X_**** Befehlen überall gleich die Objektnummer angeben kann? So ist es imho sehr schwer viele Objekte zu behandeln. Oder hab ich was übersehen?

2. Nummern für Objekte sind für wenige Objekte total in Ordnung, aber wenn ich viele Objekte auf dem Bildschirm habe wäre es evtl. besser, die Objekte mit einem Integer-Handle anzusprechen. Dazu 2 Dinge:

2a) Man könnte das natürlich mit Variablen machen, aber Konstanten würden mehr Sinn machen. Die Objektnummern sind ja von vorneherein festgelegt und ändern sich nicht mehr. So könnte man wertvolle Ressourcen sparen, weil Konstanten direkt kompiliert werden im Gegensatz zu variablen.

2b) Variablen würden Sinn machen, wenn man die Nummer der Objekte gar nicht mehr selber festlegt, sondern z.B. die X_LoadObj Funktion einfach die Nummer des Objekts ausspuckt, die ich dann in einer Variable speichern kann (variable = X_LoadObj "meinmodell.ddd") oder ich der Funktion die variable übergebe und die Funktion die Nummer in der Variable speichert (X_LoadObj "meinmodell.ddd", variable) was sich evtl leicht in GLBasic integrieren lassen würde (X_LoadObj überprüft ob variable den Wert NULL hat, was ja der Fall sein müsste da variable erst beim Aufruf der Funktion definiert, aber nicht initialisiert wird)

Und dann eben z.B. X_ROTATION modell, phi#, x#, y#, z#
Wäre einfacher und logischer finde ich.

3. Gernot, warum hast du mir denn früher nicht gesagt, dass GLBasic bereits "richtige" NormalMaps fürs BumpMapping verwendet? Bin ich eben erst draufgekommen, weil ich mal die auskommentierte Zeile SAVESPRITE 1, "bump_work.bmp" mitkompiliert hab und mir dann das Bild angeschaut hab. Finde ich klasse, das bedeutet nämlich dass man seine Figuren wie bei Doom3 mit "virtuellen Polygonen" ausstatten kann =) Und ich hacke auf dir rum dass du doch bitte Normalmapping in GLBasic einbauen sollst und derweil ist das schon Normalmapping ;)

Sebe

Gernot, kannst du mal bitte dieses Modell überprüfen? Irgendwie funktioniert die Textur und die Normalmap nicht richtig http://www.kudoscry.com/hellknight.zip

Kitty Hello

Quote from: Sebe1. Wie genau behandelt man 3D Objekte? In der Hilfe steht immer: "Das nächste Objekt..." Wäre es nicht sinnvoller, wenn man bei den X_**** Befehlen überall gleich die Objektnummer angeben kann? So ist es imho sehr schwer viele Objekte zu behandeln. Oder hab ich was übersehen?
ich find's viel übersichtlicher, wenn man einfach nur X_SCALING, X_MOVEMENT, X_ROTATION schreibt, und direkt dannach ein X_DRAWOBJ, statt das für jedes Objekt separat zu speichern.

Quote2. Nummern für Objekte sind für wenige Objekte total in Ordnung, aber wenn ich viele Objekte auf dem Bildschirm habe wäre es evtl. besser, die Objekte mit einem Integer-Handle anzusprechen. Dazu 2 Dinge:

2a) Man könnte das natürlich mit Variablen machen, aber Konstanten würden mehr Sinn machen. Die Objektnummern sind ja von vorneherein festgelegt und ändern sich nicht mehr. So könnte man wertvolle Ressourcen sparen, weil Konstanten direkt kompiliert werden im Gegensatz zu variablen.
Hm... const könnte man machen, Find' ich aber unnötig kompliziert.

Quote2b) Variablen würden Sinn machen, wenn man die Nummer der Objekte gar nicht mehr selber festlegt, sondern z.B. die X_LoadObj Funktion einfach die Nummer des Objekts ausspuckt, die ich dann in einer Variable speichern kann (variable = X_LoadObj "meinmodell.ddd") oder ich der Funktion die variable übergebe und die Funktion die Nummer in der Variable speichert (X_LoadObj "meinmodell.ddd", variable) was sich evtl leicht in GLBasic integrieren lassen würde (X_LoadObj überprüft ob variable den Wert NULL hat, was ja der Fall sein müsste da variable erst beim Aufruf der Funktion definiert, aber nicht initialisiert wird)
http://www.glbasic.com/forum/viewtopic.php?id=177 Etwa so??

Quote3. Gernot, warum hast du mir denn früher nicht gesagt, dass GLBasic bereits "richtige" NormalMaps fürs BumpMapping verwendet? Bin ich eben erst draufgekommen, weil ich mal die auskommentierte Zeile SAVESPRITE 1, "bump_work.bmp" mitkompiliert hab und mir dann das Bild angeschaut hab. Finde ich klasse, das bedeutet nämlich dass man seine Figuren wie bei Doom3 mit "virtuellen Polygonen" ausstatten kann =) Und ich hacke auf dir rum dass du doch bitte Normalmapping in GLBasic einbauen sollst und derweil ist das schon Normalmapping ;)
Ah - das ist also normalmapping ;) Wenn man mit LOADBUMPTEXTURE verwendet, lädt und konvertiert GLBasic das Graustufen-Bild in eine Normal-Map, die man für Bumpmapping braucht. Die kann man als 2. Parameter bei X_SETTEXTURE angeben. Wenn man die normal-map schon hat (die sind so lila irgendwie), dann statt LOADBUMPTEXTURE einfach LOADSPRITE verwenden.

Kitty Hello

Quote from: SebeGernot, kannst du mal bitte dieses Modell überprüfen? Irgendwie funktioniert die Textur und die Normalmap nicht richtig http://www.kudoscry.com/hellknight.zip
Dahrgh!!! Ist ein Bug. Ich schau und mach Update...

Sebe

Hmm, trotzdem entzieht sich mir die Art und Weise, wie man mit diesem Objekthandling ordentlich programmieren soll. Das schreibe ich aber nichtmal GLBasic zu, es gibt einfach kein Beispiel mit mehreren Objekten die sich unabhängig von einander bewegen etc.
Evtl könntest du ja mal ein Tutorial dazu machen?

Bezüglich der Funktionen: Ja, so in etwa stelle ich mir das vor.

Zum Bug: Danke, bin schonmal gespannt, wie das Modell hinterher in GLBasic aussehen wird =) Ist aus Doom3 geklaut übrigens ^^

Kitty Hello

Wie man mehrere Objekte platziert?

Code (glbasic) Select
X_MOVEMENT plx, ply, plz
X_ROTATION pl_dir, 0,1,0
X_DRAWOBJ player, 0

X_MOVEMENT enx, eny, enz
X_ROTATION ene_dir, 0,1,0
X_DRAWOBJ enemy, 0
*kopfkratz* Ist das schwierig? Es ist anders als bei SPRITEs, stimmt. Bei 3D multipliziert man die Transformationsmatrix eben mit den X_MOVEMENT/X_ROTATION/X_SCALING Befehlen, und zeichet das Objekt eben an die gerade aktuelle verdrehung/verschiebung. Mit X_PUSHMATRIX kann man dann nor relativ zur aktuellen Matrix weitere Verdrehungen/verschiebungen einfügen.

Wichtig sind nur 2 Sachen:
- Wenn man X_SCALING verwendet, bitte auch wieder auf 1,1,1 zurücksetzen - sonst wird's lustig ;)
- Wenn man X_ROTATION verwendet, löscht jeder X_MOVEMENT oder X_SCALING _alle_ Rotationen. Daher diese immer nach der Position machen (oder mit X_PUSHMATRIX)

Du hast Mail wg. dem Model - war ein Fehler im Konverter. Bitte schau kurz, ob er jetzt geht.

Sebe

Ja funktioniert! Und wie geil das aussieht zeige ich euch gleich in einem extrathread wenn ich die Doom3 Demo fertig habe =)

Wegen dem System: Ok, dann war es doch so wie ich es mir zuerst gedacht habe. Mal sehen wie ich damit zurecht komme =)

Wie kann man eigentlich während das Programm läuft die Bildschirmauflösung ändern?

Kitty Hello

Bildschirmauflösung geht noch nicht. Muss ich unbedingt jetzt mal machen.

Sebe

Kann es sein dass Cullmode verbugged ist? 1 hat bei meiner Demo den Effekt, dass ich nur die Innenwände meines Modells sehe, und -1 zeigt nur die Äusseren. Sollte es nicht umgekehrt sein?

Und die Stencil Schatten haben noch Fehler. Sieht man bei deiner Demo recht deutlich. Hast du Z-Pass und Z-Fail eingebaut? Oder nur Z-Pass?

Kitty Hello

HAb nur z-pass eingebaut. Der Cullmode ist OK, nur das Modell wird verkehrt herum konvertiert - ich mach's die nächstn Tage.
PS: So spät geh' ja nichtmal ich in's Bett ;) - OK, mich wecken auch um 7:00 die Kids :P

Sebe

Ach so, das erklärt die fehlerhaften Schattenfragmente die teilweise auftauchen =) Falls du mal Zeit hast kannst du ja mal schauen, ob du Z-Fail auch noch einbauen kannst (wie gesagt: wenn du Zeit dafür findest).

Was mir aufgefallen ist:

Keine Schatten und keine Normalmap: 250 FPS
Keine Schatten aber Normalmap: 230 FPS
Schatten aber keine Normalmap: 240 FPS
Schatten und Normalmap: 130 FPS

Ich kann mir diesen extremen Framedrop einfach nicht erklären, evtl. lässt sich der zuständige Code dafür ja noch optimieren ;-)
Evtl habhe auch ich einen Fehler gemacht, vielleicht willst du dir meinen Quellcode mal anschauen:

Code (glbasic) Select
// ------------------------
// Doom3 Normalmapping Demo
//
// by sebe@risingrealms.com
// ------------------------

LOCAL nmap, phi, shadow, mx, my, ma, mb, dtime, fps, delay, fps_draw, debug

SETSHOEBOX "doomdemo.pak",""
LOADSPRITE "colormap.bmp",0
LOADSPRITE "normalmap.bmp", 1
X_LOADOBJ "hellknight.ddd", 1
X_AUTONORMALS 1

nmap = 0
shadow = 1

WHILE TRUE

X_MAKE3D 1, 1500, 90
X_CAMERA 10, 10, 100, 0,0,0

phi=phi+GETTIMER()/20; IF phi>=360 THEN phi=phi-360

IF nmap = 1

X_ROTATION phi, 0, 0.01, 0
X_SPOT_LT -1, RGB(255,255,255), 0,0,50, 0,0,0, 360
X_SETTEXTURE 0, 1

ELSE

X_ROTATION phi, 0, 0.01, 0
X_SPOT_LT 1, RGB(255,255,255), 0,0,50, 0,0,0, 360

IF debug = 1

X_SETTEXTURE 0, 1

ELSE

X_SETTEXTURE 0, -1

ENDIF

ENDIF

X_DRAWOBJ 1, 0

IF shadow; X_SPOT_LT  -3, 0, 0,0,50, 0,0,0, 360; X_DRAWOBJ 1,0; ENDIF

MOUSESTATE mx, my, ma, mb

IF ma = 1; nmap = 1; debug = 0; shadow = 1; ENDIF

IF mb = 1; nmap = 0; debug = 0; shadow = 1; ENDIF

IF KEY(57) = 1; nmap = 0; debug = 1; ENDIF

IF KEY(28) = 1; debug = 0; shadow = 0; ENDIF

X_MAKE2D

PRINT "Left mouse button for Doom3",10,25
PRINT "Right mouse button for 0815",10,50
dtime=GETTIMER()
fps = ((1000/dtime)+fps)/2
delay=delay+dtime
IF delay>1000
delay=0
fps_draw=fps
ENDIF
PRINT "FPS: "+fps_draw,10,570
SHOWSCREEN
WEND
Ich wäre sehr dankbar dafür, denn eigentlich dürfte der Framedrop ja nicht so gross sein oder?

Edit: Es ist übrigens kein Geschwindigkeitsverlust bei 1024x768 sichtbar =) Aber könntest du bitte - wenn du ermöglichst die Auflösung aus dem Programm heraus zu ändern - auch höhere Auflösungen unterstützen? 1024x768 sieht auf meinem 19" TFT mit seiner nativen Auflösung von 1280x1024 immer noch recht "matschig" aus.

Kitty Hello

Oh. Um Bump + Schatten zu machen zeichest Du das Model einmal mit Bumomapping, dann _nochmal_ mit Schatten. Dadruch hast Du 2x die Arbeit gemacht. Geht aber gar nicht anders...
Was viel bringen kann, ist, wenn Du für den Schatten dann die Textur und das Licht ausschaltest:
Code (glbasic) Select
// ------------------------
// Doom3 Normalmapping Demo
//
// by sebe@risingrealms.com
// ------------------------

LOCAL nmap, phi, shadow, mx, my, ma, mb, dtime, fps, delay, fps_draw, debug

SETSHOEBOX "doomdemo.pak",""
LOADSPRITE "colormap.bmp",0
LOADSPRITE "normalmap.bmp", 1
X_LOADOBJ "hellknight.ddd", 1
X_AUTONORMALS 1

nmap = 0
shadow = 1

WHILE TRUE

    X_MAKE3D 1, 1500, 90
    X_CAMERA 10, 10, 100, 0,0,0

    phi=phi+GETTIMER()/20; IF phi>=360 THEN phi=phi-360

    IF nmap = 1
        X_ROTATION phi, 0, 0.01, 0
        X_SPOT_LT -1, RGB(255,255,255), 0,0,50, 0,0,0, 360
        X_SETTEXTURE 0, 1
    ELSE
        X_ROTATION phi, 0, 0.01, 0
        X_SPOT_LT 1, RGB(255,255,255), 0,0,50, 0,0,0, 360
        IF debug = 1
            X_SETTEXTURE 0, 1
        ELSE
            X_SETTEXTURE 0, -1
        ENDIF
    ENDIF

    X_DRAWOBJ 1, 0

    IF shadow
        X_SPOT_LT  -3, 0, 0,0,50, 0,0,0, 360
        X_SETTEXTURE -1, -1
        X_SPOT_LT 1, 0, 0,0,0, 0,0,0, 0
        X_DRAWOBJ 1,0
    ENDIF
    MOUSESTATE mx, my, ma, mb
    IF ma = 1; nmap = 1; debug = 0; shadow = 1; ENDIF
    IF mb = 1; nmap = 0; debug = 0; shadow = 1; ENDIF
    IF KEY(57) = 1; nmap = 0; debug = 1; ENDIF
    IF KEY(28) = 1; debug = 0; shadow = 0; ENDIF
    X_MAKE2D

    PRINT "Left mouse button for Doom3",10,25
    PRINT "Right mouse button for 0815",10,50
    dtime=GETTIMER()
    fps = ((1000/dtime)+fps)/2
    delay=delay+dtime
    IF delay>1000
        delay=0
        fps_draw=fps
    ENDIF
    PRINT "FPS: "+fps_draw,10,570
    SHOWSCREEN
WEND
Muss man mal testen, ob das was bringt.

Sebe

Gute Idee, der Performancedrop dürfte dann bei Weitem nicht so gross sein. Muss man nur schauen, dass dann die Textur nicht flimmert oder so.
Kann ich aber leider grade nicht testen weil ich Vista drauf habe und ATIs Treiber noch kein OpenGL Hardware beschleunigen :-/ Naja, heute Abend bekomme ich meinen Laptop, da gehts dann wieder =)

Sebe

Funktioniert nicht, der Bildschirm bleibt - bis auf die Schrift - schwarz :-/