x_spot Light keine feste Position?

Previous topic - Next topic

nabz32

Hallo, wollte für mein RPG Projekt Objekte testen, welche mit einem Licht verknüpft wurden.

Ich benutze die Nummern 1 - 7 für meine x_spot_lt Aufrufe

Die Position der Lichter sowie ihre Richtung ändern sich nicht
(sie bekommen beim Laden fixe Positionen und Richtungen zugewiesen ).

Wenn die Kamera sich nun von der Lichtquelle entfernt, so scheint sich die Lichtposition auch zu verändern.

Sowohl .ddd, als auch Nutzer generierte Objekte weisen dieses Problem auf.

Hier mal ein Video von dem Verhalten:


kanonet

Part of the light equation is also your 'camera position' so if you move the camera, you also slightly change the output in light. This is especially visible when you have big triangles in comparison to the light distance. If you add more triangles to your models (so each one is smaller) you will get a better results. Yeah per vertex lighting will never look really good.
If your not sure if you set the position correct or want to see if something gets changed by a side effect of your code, you can draw an object at your light position (a small cube or X_DOT/X_LINE) and see if it really does not move.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

nabz32

Thx for the x_line hint.
I allready thought, that the light effect changes depending on the camera angle, but
I had no idea, that this effect would be visible to such an extend.

If I move the light up, this side effect starts to disappear, but also the light effect I wanted to achieve does too.




kanonet

Normally it would not be that much visible, but you have the light source really close to big triangles. If you make smaller triangles it will be less visible (but more hardware demanding). Since your lights are static, it may be the best idea to simply use a lightmap and incorporate this in your textures.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

nabz32

Ich habe einen Fehler beim Aufruf von X_Spot_LT. Ich habe den Richtungs-Vektor mit dem End Punkt der Licht Richtung verwechselt...
Habe auch feststellen müssen, dass Lichter nicht automatisch verschwinden, wenn sie nicht mehr aufgerufen werden, wenn man Lichter löschen möchte, so sollte man ein Licht mit einem ÖffnungsWinkel von 0 grad daraus machen.


kanonet

Ja, OpenGL ist eine state-machine, wenn du einen Zustand setzt (z.B. ein Licht aktivierst), dann bleibt dieser Zustand erhalten, bis du ihn wieder änderst (hier neues Licht auf die gleiche ID schreiben, oder deaktivieren wie du es getan hast). Sieht das Ergebnis mit berichtigten Vektoren jetzt besser aus?
Da deine Szene sicher viele Lichtquellen hat, aber du nur 8 garantierte (Licht 0-7) hast, empfiehlt es sich genau zu prüfen, welche Lichter gerade im Sichtbereich sind und nur diese zu rendern. Ansonsten eben noch eine Prioritätssortierung oder eventuell die bereits vorgeschlagenen lightmaps.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

nabz32

Ich zeichne Grundsaetzlich nur im sichtbaren Bereich.
Ist ein Licht ausserhalb des sichtbaren Bereichs wird es auch deaktiviert
(ich hatte es davor nur aus der liste geloescht).
Man kann fuer jeden Objekttyp einstellen, ob es eine "Lichtquelle" sein soll, sowie Farbe
und "Groesse" des Lichts bestimmen.

Die Szene sieht jetzt so aus wie ich mir das vorgestellt hatte. Zwar habe ich nur ein grade von oben nach unten scheinendes spot light, aber das reicht mir schon aus.
Ein point light waere vermutlich schoener, aber dazu muesste man irgend eine Licht Intensitaet, oder Reichweite eingeben koennen. 

Schranz0r

I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

nabz32

Also es ist noch annehmbar mit dem Lichtkegel ( Bilder sind im Anhang ).

War da schon jemand fleißig beim setzen der Light range?
Eine Beispiel Szene mit einem solchen Licht wäre bestimmt ne gute Motivation das
Entity System zu nutzen.


kanonet

Das ES zu nutzen, nachdem dein Projekt bereits funktioniert, würde einen riesigen Aufwand bedeuten (alles auf eine andere Technik umschreiben) und ist sicher nicht nötig. Wenn du die Lichtreichweite unbedingt begrenzen willst, kannst du das mit Inline + native OpenGL tun, genau so wie es Schranzor vorgemacht hat, das ES brauchst du dazu nicht. Eine Anregung dazu: http://wiki.delphigl.com/index.php/Tutorial_Lektion_8#Etwas_schw.C3.A4cher_bitte
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

Du kannst es ganz einfach auf deinen Code anpassen. Im Prinzip lese einfach mal weiter unten im verlinkten thread. Solltest du Probleme haben, helfe ich dir gerne.  :good:
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

nabz32

Danke Schranz0r und Kanonet für die Anregungen!

Also ich habe es so versucht:

X_Spot_LT iLight , farbe , x , y , z , 0 , 0 , 0 , 180
also erstmal versucht die light range auf ein paralleles Licht anzuwenden.
(Habe auch versucht einfach mal einen RichtungsVektor zuzuweisen, dann erst bekomme ich nach
benutzen von glLightAttenuation ein Licht heraus, jedoch ist es immernoch ein Licht unbegrenzter Reichweite )
Dann
glLightAttenuation( iLight , 1.00 , 0.01 , 0.04 )
wobei ich mir bei den Werten für linear , constant und quadratic unsicher bin.

Ich bekomme kein Licht mit der Methode...

Lässt sich das nur auf spot_lts im herkömmlichen Sinne anordnen, oder muss ich die Lichter von Grund auf mit INLINE + OpenGL Code erstellen, damit das richtig zusammengreift ?

kanonet

Öffnungswinkel 180 = Direktionales Licht = hat keinen Startpunkt, sondern nur einen Richtungswechsel und ist per Definition unendlich.
Attentuation kannst du nur auf Pointlight (Öffnungswinkel = 360) und Spotlight (Öffnungswinkel <>180 und <>360).

Ja prinzipiell kannst du X_SPOT_LT und INLINE zusammen verwenden.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

nabz32

#13
Vielen Dank fuer die genaue Erklaerung, ich hatte mich schon gewundert, wieso der Oeffnungswinkel ueber 180 Grad hnausgeht,
muss mich noch genauer informieren zu dem Thema.
Die Tutorials zu OGL scheinen ziemlich gut zu sein, versuche es,
wenn ich Zeit habe zu lesen...

Habe auch was schoenes dank eurer Hilfe hinbekommen:

Edit: Läuft auch schön auf der Pandora