Licht/Schatten in 3d/ES

Previous topic - Next topic

BumbleBee

Ok thx.  Bin gerade am Testen mit der Beta 9.052.
Also der  Schatten wird wie in dem Video, dass ich gemacht hab immer noch weggeclippt. Gibts da noch was was ich jetzt anders einstellen muß oder ist der Bug da vielleicht noch gar nicht behoben? Besonders interessant ist aber das man beim Start volle FPS hat und die dann plötzlich runter gehen auf manchmal 10 FPS oder noch weniger. Einfach z.B. mal das 3D Maze oder S-Zero Beispiel im Samples Ordner ausführen. Die FPS gehen jetzt sehr weit in den Keller. Aber dafür ist es ja auch noch eine Beta Version.  =D Bei wem ist das noch so?

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

kanonet

Wenn ich das richtig gesehen habe, dann gab es in den neueren Betas nach 9.052 keine Änderungen an der 3D/Schattenengine? Wird daran im Moment gearbeitet oder haben andere Bereiche höhere Priorität? :whistle:

Grüße.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

Oh. S-Zero und 3D Maze machen bei mir alles schwarz :S

Muss ich mal sehen. Was das nu wieder is... !?

10 FPS ist bisserl wenig. Sowas doofes.
Am Schatten habe ich was geändert. Ich meine, dass Objekte jetzt bei aktivem Schatten nicht mehr geclipt werden (sollten).
Bei meinem Test ging das.

BumbleBee

Wenns eine neue Beta gibt dann sag bitte bescheid. Ich teste dann gleich mal.  =D

Cheers
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

kanonet

Ich habe jetzt V10 getestet, konnte aber keine Veränderungen zu meinem Test hier feststellen, die Probleme bestehen immer noch in der dort beschriebenen Form. Ist damit zu rechnen, dass sich dies in der nächsten Zeit noch einmal angeschaut wird? Ich bin immer gerne bereit diverse Tests durchzuführen, falls es nötig ist. ;)

Grüße.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

X_SCALING Schatten würde viel Rechenpower benötigen. Soll ich das wirklich einbauen?
Schatten im Nebel kann man wohl auch nicht so leicht lösen, da ich für den Schatten ein single-pass Verfahren verwende (brutalinski schnell, aber halt auch Einschränkungen)
X_LINE muss ich behben.

kanonet

X_SCALING und X_SCALEMODEL unterscheiden sich in der Nutzung grundsätzlich und haben sicher beide ihre Berechtigung. Obwohl GLBasic mit möglichst wenigen Befehlen auskommen soll, würde ich dafür plädieren, beide zu behalten (solange es nicht zu viel Aufwand für dich wäre). Natürlich müssten dann auch beide Funktionieren. ;)
Wäre die Verlangsamung denn sehr signifikant? Und würde sie den Befehl generell betreffen, oder nur beim Zeichnen von Schatten auftreten? Letzteres wäre sicherlich akzeptabel, da man den Spieler ohnehin die Chance geben sollte die Schatten zu deaktiveren, wenn seine Rechenleistung nicht ausreichend ist.
Das mit dem Nebel ist natürlich auch keine gute Nachricht, auch hier wäre wieder die Frage: wie stark fiele die Verlangsamung aus und ließe sie sich auf die Nutzung von Schatten beschränken?
Der mich am meisten störende Bug in der Schattenengine ist aber ohnehin der Umstand, dass Schatten werfende Körper immer dunkel sind (da sie sich vermutlich selbst vollständig in Schatten hüllen). Würde dies behoben werden, wäre das für mich persönlich schon ein großer Schritt nach vorn.

Grüße.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

Ich verstehe das nicht: Schattenwerfendes Objekt im Schatten - Kannst Du hier ein Beispiel machen?

kanonet

Ich meine das, was ich u.a. hier beschrieben habe:
Siehe Punkt 2 (sogar mit Bild)
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

#39
Ah. kapiert. Hm... Das kommt bei Quadern mit direkter Lichteinstrahung vor. Kann ich sicher ändern!

[Edit]
OK, alle Probleme sind gelöst (Update auf 10.013 oder höher (rappelt gerade im Hintergrund) ).

Testprogramm:
Code (glbasic) Select

SETCURRENTDIR("..")
// LOADSPRITE "icon.png", 0

DRAWRECT  0,0,16,16,0xffffff
DRAWRECT 16,0,16,16,0x00ff00
DRAWRECT  0,16,16,16,0xf0000
DRAWRECT 16,16,16,16,0x0000ff
PRINT "TEST",0,0
GRABSPRITE 0,0,0,32,32

LOCAL skybox=0, box1=1, box2=2, phi, lx, ly, lz, mx, my=600, mz=15, scale=1
LOCAL plane%=5

// Objekte erzeugen
CreateCube  (skybox, -100, RGB(255, 255, 255))
CreateCube  (box1, 5, RGB(255,255,255))
CreateCube  (box2, 5, RGB(255,255,255))




X_OBJSTART plane
X_OBJADDVERTEX -100,0, -100, 0,0,0xffffff
X_OBJADDVERTEX  100,0, -100, 0,0,0xffffff
X_OBJADDVERTEX -100,0,  100, 0,0,0xffffff
X_OBJADDVERTEX  100,0,  100, 0,0,0xffffff
X_OBJEND

X_SCALEMODEL box1, 3,1,1

// Hauptschleife
WHILE TRUE
// Eingaben abfragen
mx = mx + MOUSEAXIS(0) // Maus X-Achse -> Kamera drehen
my = my + MOUSEAXIS(1) // Maus Y-Achse -> Kamera zoomen
mz = mz + MOUSEAXIS(2) // Mausrad -> Licht bewegen
IF KEY(27) THEN INC scale, 0.1 // + gedrückt -> Quader strecken
IF KEY(53) THEN DEC scale, 0.1 // - gedrückt -> Quader stauchen

// Bewegung des Lichts berechnen
phi = GETTIMERALL() / 250
lx = SIN(-phi*3)*mz*2
ly = (SIN(3*phi)-COS(4*phi)) // bitte auch konstanten Wert ausprobieren, z.B. ly=2
lz = COS(-phi*3)*mz*2

// 3D Szene zeichnen
X_MAKE3D 1, 500, 45
X_CULLMODE 1
X_FOG RGB(180,180,200), FALSE, 250,270

// Kamera
X_CAMERA  my*COS(mx)/10,14,my*SIN(mx)/10 , 0,0,0


// Lichtquelle
X_SPOT_LT   0, RGB(255,255,255), lx,ly,lz, 0,0,0, 360

// Skybox
X_DRAWOBJ skybox, 0


X_DRAWOBJ plane, 0


// Box1 (mit Schatten)
X_MOVEMENT 25,0,0
X_SCALING scale,1,1 // spiele mal etwas damit rum, das Verhalten der Schatten ist interessant ;)
X_DRAWOBJ box1,0

// Box2 (ohne Schatten)
X_MOVEMENT -12,0,0
X_SCALING scale,1,1
X_DRAWOBJ box1, 0

// Billboard
// X_SPRITE 0, 0,0,0, 1.0


// Lichtquelle für Schatten setzen
X_SPOT_LT  -3, RGB(255,255,255), lx,ly,lz, 0,0,0, 360

// schattenwerfenden Würfel zeichnen
X_MOVEMENT 25,0,0
X_SCALING scale,1,1
X_DRAWOBJ box1,0

X_SPOT_LT  -3, RGB(0,0,64), lx,ly,lz, 0,0,0, 0

// zeigt uns wo der Schatten liegen und wie er aussehen sollte (siehe Hinweise bei der Funktionsdefinition)
ShadowLines(box1, lx,ly,lz)

// etwas Text ausgeben
X_MAKE2D
DRAWRECT 0,0,800,20,RGB(0,0,0)
PRINT "KAMERASTEUERUNG: MAUS BEWEGEN    |    LICHTQUELLE BEWEGEN: MAUSRAD    |    QUADER SKALIEREN: +/-", 0,0

DRAWSPRITE 0,0,0
// und alles auf den Bildschirm bringen
SHOWSCREEN
WEND


// zeichnet eine Linie von der Lichtquelle durch jeden Vertex des Objekts und bietet somit eine Orientierung wie der Schatten aussehen sollte
// ignoriert GLBasic-bedingt sämtliche Drehungen, Skalierungen und Bewegungen des Objekts
FUNCTION ShadowLines: obj, x,y,z
LOCAL face[], count = X_NUMFACES( obj )
X_CULLMODE 0 // X_DOT und X_LINE funktionieren nur bei X_CULLMODE 0
FOR i = 0 TO count - 1
X_GETFACE obj , 0 , i , face[]
X_LINE x,y,z, 4*(25+face[0][0])-3*x, 4*face[0][1]-3*y, 4*face[0][2]-3*z, 3, RGB(255,255,0)
X_LINE x,y,z, 4*(25+face[1][0])-3*x, 4*face[1][1]-3*y, 4*face[1][2]-3*z, 3, RGB(255,255,0)
X_LINE x,y,z, 4*(25+face[2][0])-3*x, 4*face[2][1]-3*y, 4*face[2][2]-3*z, 3, RGB(255,255,0)
NEXT
X_CULLMODE 1
ENDFUNCTION

kanonet

#40
Tritt natürlich nicht nur bei Quadern mit direkter Lichteinstrahlung auf. ;)
Aber für mich sieht es so aus, als hättest du dieses Problem gelöst, Gratulation und Danke! :nw:
Man muss nun wieder zwingend das zweite X_SPOT_LT -3 setzen, damit es funktioniert, das nur als Hinweis an andere, die es selbst ausprobieren wollen. Übrigens bedeutet das, dass das Entitysystem ausgebessert werden muss, dieses arbeitet nur mit einem X_SPOT_LT -3 (ich würde ja meine Verbesserung posten, habe aber schon deutlich mehr Veränderungen vorgenommen).

Die anderen Probleme die ich beschrieben habe bestehen natürlich weiterhin, ich verweise dazu auf diesem Post, Punkt zwei wurde gelöst, Rest ist noch aktuell.


EDIT:
Der Übergang von Licht zugewandter zu im Schatten liegender Seite eines Objekts ist etwas sehr kantig/schlagartig. Beobachte mal den Dounat im Samples/3D/schadows, dann solltest du sehen, was ich meine.
Dafür habe ich gerade festgestellt, das X_LINE auch repariert wurde und nun wieder funktioniert. :good:
Als nächstes wünsche ich mir eine Klärung von X_SCALEMODEL vs X_SCALING.
Noch eine Idee zum Nebel+Schatten: Nebel werden ja meist in größerer Entfernung gezeichnet, wäre es da nicht auch möglich ab einer gewissen Entfernung keine Schatten mehr zu zeichnen? Für meine Zwecke wäre das OK, da es dem Spieler sicher nicht auffallen würde, dafür wäre das Problem Schatten+Nebel gelöst und es würde Rechenzeit eingespart werden. Kann ich aber auch locker selbst so programmieren. :booze:
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

Hast Recht - nach dem Zeichnen der Schatten kann man mit X_SPOT_LT -3, RGB die Farbe zu wechseln. Sollte aber mit X_MAKE2D/SHOWSCREEN auch gehen -> muss ich nochmal abchecken.

Nebel kann ich nicht machen, da mein Schatten ein 1-pass Verfahren ist:
Ich zeichne die Szene beleuchtet, dann die Shadow-Volumes als 3D in den Stencil buffer. Dabei invertiere ich diesen mit jedem überzeichnen. Wenn jetzt der Stencil-Buffer =0 ist (also 0, 2, 4, 8 Schattenflächen darüber gezeichnet), dann ist hier kein Schatten. Sonst schon.
Und dann (Trick 17) zeichne ich ein einfarbiges Rechteck in 2D über den Bildschirm an den Stellen, wo Stencil=1 ist (also im Schatten). Klar, dass das Monstermäßig schneller ist als die komplette Szene 2x zu rendern. Ist nicht ganz sauber, sieht aber ganz gut aus. Problem: Dieser Schatten ist quasi nur eine Sonnenbrille mit Löchern reingeschnitten -> Keine Z Information.

Schatten skalierter Objekte geht doch!? Das Model ist X_SCALING 5,1,1, oder?

X_GETFACE liefert Koords des Objekts - hat nichts mit X_MOVEMENT zu tun! Du kannst aber X_GETMATRIX machen und die Koordinaten durch diese Matrix jagen um die Welt-Koords zu haben. (Auch hier ist scaling dann berücksichtigt).

X_SCALEMODEL skaliert das Model, als hättest Du es so gezeichnet. Damit geht auch Kollision korrekt. Die Schatten werden auch mit X_SCALING gut angezeigt.


kanonet

Das zweite X_SPOT_LT -3 muss im Moment zwingend gesetzt werden, sonst funktioniert es nicht. Ist aber kein Problem und kann meinetwegen gerne so bleiben, man muss es nur wissen.
Dass das mit dem Nebel nicht behoben werden kann habe ich schon verstanden, daher hatte ich ja mein persönliches Work-around erwähnt, für den Fall, dass du es als Standard oder Option in GLB integrieren willst.
X_GETFACE funktioniert einwandfrei, ich hatte nicht gesehen, dass du meine Funktion Shadowlines() verändert hattest. :-[
Ich weiß wozu X_SCALEMODEL und X_SCALING da sind, nur funktionieren sie beide noch nicht fehlerfrei. Außerdem ist mir noch nicht klar, ob du vor hast uns beide Befehle definitiv zu erhalten, oder ob einer der beiden später aus dem Befehlssatz verschwinden soll.

Damit bleiben auf meiner Bugliste der Schattenengine nur noch:
1. Schatten+Nebel --> kann wohl nicht ohne weiteres behoben werden und ist mir nicht wichtig
2. Übergang von Licht zu Schattenseite eines Objekts ist zu schlagartig (siehe meinen letzten Post)
3. Skalierung geht immer noch nicht, weder mit X_SCALEMODEL, noch mit X_SCALING siehe dazu mein Beispiel (bitte unbedingt die Tasten + und - verwenden, sonst wird nichts skaliert ;)):
Code (glbasic) Select
SETSCREEN 800,600,0

LOCAL skybox=0, box1=1, box2=2, phi, lx, ly, lz, mx, my=600, mz=15, scale=1
LOCAL plane%=5

// Objekte erzeugen
CreateCube  (skybox, -100, RGB(255, 255, 255))
CreateCube  (box1, 5, RGB(255,255,255))
CreateCube  (box2, 5, RGB(255,255,255))

// Hauptschleife
WHILE TRUE
// Eingaben abfragen
mx = mx + MOUSEAXIS(0) // Maus X-Achse -> Kamera drehen
my = my + MOUSEAXIS(1) // Maus Y-Achse -> Kamera zoomen
mz = mz + MOUSEAXIS(2) // Mausrad -> Licht bewegen
IF KEY(27) // + gedrückt -> Quader strecken
scale=scale*1.1
X_SCALEMODEL box2, 1.1,1,1
ENDIF
IF KEY(53) // - gedrückt -> Quader stauchen
scale=scale*0.9
X_SCALEMODEL box2, 0.9,1,1
ENDIF

// Bewegung des Lichts berechnen
phi = GETTIMERALL() / 250
lx = SIN(-phi*3)*mz*2
ly = (SIN(3*phi)-COS(4*phi)) // bitte auch konstanten Wert ausprobieren, z.B. ly=2
lz = COS(-phi*3)*mz*2

// 3D Szene zeichnen
X_MAKE3D 1, 500, 45
X_CULLMODE 1
X_FOG RGB(180,180,200), FALSE, 250,270

// Kamera
X_CAMERA  my*COS(mx)/10,14,my*SIN(mx)/10 , 0,0,0


// Lichtquelle
X_SPOT_LT   0, RGB(255,255,255), lx,ly,lz, 0,0,0, 360

// Skybox
X_DRAWOBJ skybox, 0

// Box1 (oben)
X_MOVEMENT 0,0,0
X_SCALING scale,1,1 // spiele mal etwas damit rum, das Verhalten der Schatten ist interessant ;)
X_DRAWOBJ box1,0

// Box2 (unten)
X_MOVEMENT 0,-9,0
X_SCALING 1,1,1
X_DRAWOBJ box2, 0

// Lichtquelle für Schatten setzen
X_SPOT_LT  -3, RGB(255,255,255), lx,ly,lz, 0,0,0, 360

// Box1 (oben)
X_MOVEMENT 0,0,0
X_SCALING scale,1,1
X_DRAWOBJ box1,0

// Box2 (unten)
X_MOVEMENT 0,-9,0
X_SCALING 1,1,1
X_DRAWOBJ box2, 0

// Schattenmodus beenden
X_SPOT_LT  -3, RGB(0,0,32), lx,ly,lz, 0,0,0, 0

// zeigt uns wo der Schatten liegen und wie er aussehen sollte (siehe Hinweise bei der Funktionsdefinition)
ShadowLines(box1, lx,ly,lz)

// etwas Text ausgeben
X_MAKE2D
DRAWRECT 0,0,800,20,RGB(0,0,0)
PRINT "KAMERASTEUERUNG: MAUS BEWEGEN    |    LICHTQUELLE BEWEGEN: MAUSRAD    |    QUADER SKALIEREN: +/-", 0,0

// und alles auf den Bildschirm bringen
SHOWSCREEN
WEND


// zeichnet eine Linie von der Lichtquelle durch jeden Vertex des Objekts und bietet somit eine Orientierung wie der Schatten aussehen sollte
// ignoriert GLBasic-bedingt sämtliche Drehungen, Skalierungen und Bewegungen des Objekts
FUNCTION ShadowLines: obj, x,y,z
LOCAL face[], count = X_NUMFACES( obj )
X_CULLMODE 0 // X_DOT und X_LINE funktionieren nur bei X_CULLMODE 0
FOR i = 0 TO count - 1
X_GETFACE obj , 0 , i , face[]
X_LINE x,y,z, 4*face[0][0]-3*x, 4*face[0][1]-3*y, 4*face[0][2]-3*z, 3, RGB(255,255,0)
X_LINE x,y,z, 4*face[1][0]-3*x, 4*face[1][1]-3*y, 4*face[1][2]-3*z, 3, RGB(255,255,0)
X_LINE x,y,z, 4*face[2][0]-3*x, 4*face[2][1]-3*y, 4*face[2][2]-3*z, 3, RGB(255,255,0)
NEXT
X_CULLMODE 1
ENDFUNCTION
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Kitty Hello

oh. Bug in X_SCALING mit Schatten. Muss ich mich mal reinlesen. Ich hab' schon eine Idee.

Ja, X_SCALING und X_SCALEOBJ bleiben beide bestehen. Die machen ja was grundliegend anderes.

WPShadow

Äh, Kitty, ab wann geht v10 denn offiziell online?
AMD X2 4600, 2 GB Ram, ATI X1950 XTX, XP PRO SP2: GLB Premium 10.beta_dingsi, <(´.´<) Kirby Dance (>`.`)>
http://lostrevenant.blogspot.com
alea iacta est