GL_LIGHT999?



  • Ist ist absolut unempfehlenswert alle 8 Lichter zu benutzen.
    Ati und Nvidia warnen davor, weil die Ergebnisse bescheiden aussehen und
    recht lange zum Rendern brauchen.

    Bei 1000 Lichtern sind Lightmaps eingentlich DIE Lösung.
    Ein Renderingpass (Multitexturing) in der die Umgebung mit Lichtern gerendert wird. Nachteil ist allerdings dass die Lichter dann nicht veränderbar sind.

    Dann gäbe es noch die Möglichkeit mit projezierten Texturen. Dazu bräuchtest
    du allerdings Vertex Programs und Multitexturing.
    Vorteil: alle Lichter können dynamisch sein und man kann durch die projezierte
    Textur noch zusätzliche Effekte erzeugen. Der Aufwand ist allerdings enorm.

    Wenn dir nichts davon richtig zusagt:
    Schreib einen Work-around! Ich gehe mal davon aus, das nicht jeder Fleck im Korridor von jeder Lampe beleuchtet wird. Hier könnte man gut was optimieren und nur die Stellen rendern die von dem speziellen Licht erreicht werden.

    Falls du doch 125 Passes machen willst, nimm die Vertex Buffer Object-Extension.
    Das ist der einzige Weg sowas überhaupt zu machen. 🙂

    [ Dieser Beitrag wurde am 26.05.2003 um 16:17 Uhr von Kane editiert. ]



  • Projizierte Texturen sollten aber auch ohne Vertex-Shader gehen!



  • Klar geht das ohne, nur möchte ich die CPU sehen die es schafft 1000 davon zu berechnen. Weiß ja nicht aus wie vielen Polygonen der Korridor besteht.



  • habt ihr vielleicht ein paar gute Links zum Thema projizierte Texturen und OpenGL? Ich konnte leider nicht viel finden mit google 😞





  • danke, werd ich mir mal angucken



  • Original erstellt von Kane:
    Klar geht das ohne, nur möchte ich die CPU sehen die es schafft 1000 davon zu berechnen. Weiß ja nicht aus wie vielen Polygonen der Korridor besteht.

    Projizierte Texturen werden aber in Hardware berechnet! Durch Texture Coordinate Transformation...


  • Mod

    @TS++
    -bewegen sich dich lichtquellen?
    -wie lang ist der korridor?
    -wieviel % des korridors beeinflusst eine lichtquelle überhaupt?
    -wieviel polygone hat der korridor?
    -wie schnell muss es denn laufen? (welches system)

    wenn man das umfeld kennt, kann man sich was ausdenken 😃

    rapso->greets();



  • Morgen zusammen!

    Erst einmal sorry, dass ich mich seit Montag nicht mehr zu Wort gemeldet habe!
    (War in Nürnberg auf der Akademika) 😉
    Und natürlich danke für eure Beiträge!

    Vielleicht sollte ich die Problemstellung etwas einschränken, so dass wir zu einer einheitlichen Lösung kommen können!( das Thema ist ja mit Sicherheit nicht neu)

    ich werd mal anhand einiger Anhaltspunkte die Problemstellung etwas konkretisieren:

    - es sollen auf jeden Fall mehr als die durch OpenGL zur Verfügung gestellten
      8 Standardlichtquellen verwendet werden
    - die Anzahl an solchen Quellen kann durch den Endanwender selbst festgesetzt   
      werden (d.h.: solange bis der Speicher nicht mehr mitspielt)
    - die Lichtquellen können tatsächlich animiert sein (d.h. in diesem Fall: einem
      Animationspfad folgen)
    - sie verändern allerdings nicht Attributwerte wie ambienten, diffusen, 
      spekularen Farbanteil, Öffnungswinkel usw . . .
    

    Der Korridor mit den 1000 Lichtern war ein sehr spezielles, evtl. auch ein etwas zu extremes Beispiel!
    Vielleicht könnte man den Aufbau der Szenerie etwas verallgemeinern:
    => sagen wir mal:

    * als Terrain : eine rechteckige Ebene
    * als SkyVolume : eine SkyBox
    * innerhalb dieser SkyBox sind nun unterschiedlichste 3DModelle an 
      unerschiedlichen Positionen in unterschiedlicher Lage plaziert
    ==> also eine Standardszenerie für einen 3DRenderer
    * zusätzlich zur globalen Lichtquelle wär es natürlich schön, wenn ich 
      ebenfalls beliebig viele PositionalLights und SpotLights in die Szene
      einbauen könnte!
    

    ==> Und genau aus dieser natürlichsten Sache der "3D-Welt" ergibt sich mein
    Problem!
    Oder ist eine Lösung für dieses Problem gar nicht so selbstverständlich?

    Unter euch gibt es gewiss eine doch erhebliche Anzahl an Profis auf dem Gebiet der 3D-Visualisierung! Es sind auch einige dabei, die mit Sicherheit schon kleinere 3D-Spiele entwickelt haben. Seit ihr nie auf dieses Problem gestossen?

    Grüße,
    TS++

    [ Dieser Beitrag wurde am 28.05.2003 um 08:58 Uhr von TS++ editiert. ]

    [ Dieser Beitrag wurde am 28.05.2003 um 08:59 Uhr von TS++ editiert. ]


  • Mod

    also an sich gibt es zwei möglichkeiten, wie du das lösen kannst

    als erstes bei beiden möglichkeiten mußt du mit culling die objekte raussuchen, welche zu sehen sind.

    dann entweder:
    1. suchst du für jedes objekt die passenden lichtquellen raus, und renderst es so oft, bis alle durch sind (bei 12 lichtquellen also 2 mal).
    dann gehst du zum nächsten objekt. lichtquellen haben ja einen einflussbereich, mit dem kannst du prüfen ob das objekt beleuchtet wird.

    oder

    2. du suchst für jede lichtquelle die objekte raus, die durch sie beeinflusst werden (natürlich nur aus der liste der zu sehenden objekte)
    dann versuchst du die lichtquellen so zusammen zu legen, dass möglichst viele gleichzeitig beim rendern aktiv sind, damit du nicht zuviele passes hast.

    bei solchen verfahren hat es sich als nützlich erwiesen, wenn die objekte eine kleine ausdehnung im raum haben.

    also falls du einen korridor hast, der aus einer box besteht mit 12polys und dort sind 1000 lichtquellen drinne, dann würdest du auf jeden fall alle lichtquellen durchgehen, auch wenn du direkt vor einer wand stehst und nur dein einfluss einer lichtquelle erkennst.
    wenn du den korridor in 100 teile zerstückelst (quasi viele boxen hintereinander mit je 8 polys), dann kannst du für die sichtbaren stücke die richtigen lichtquellen finden.

    bei multipass ist das culling sehr wichtig, somit solltest du vielleicht Occlusionculling einbauen für komplexere scenen, weil es extrem viel overdraw geben kann. (falls es zu langsamm wird)

    du solltest vielleicht auch drüber nachdenken, wieviele lichtquellen bewegt werden, wenn es z.B. ein editor ist, ist vielleicht die chance hoch, dass jemand nur eine lichtquelle zur gleichen zeit bewegen wird, dann könntest du immer die statischen lichtquellen fest in die vertexcolor von dem objekt einrechnen und nur die eine wirklich von OGL berechnen lassen.

    wenn du multipass machst und dabei direkt hintereinander das selbe objekt zeichnest, gibt es ein bufferlock welchen du benutzen kannst, dabei sorgt dann z.B. der Nvidia treiber automatisch dafür, dass die vertices im VRam bleiben bis zum unlock.

    rapso->greets();



  • Wie immer:
    200%ig zuverlässig! 😉

    Danke für die Antwort!

    Grüße,
    TS++


Anmelden zum Antworten