Quake3 BSP, Lightmaps



  • Ahoi!

    Ich habe es jetzt mit ein Paar Tutorials und Format-Specs endlich geschafft ein Quake3 Level (BSP) zu laden und zu rendern (OpenGL) 🙂 Texturen und Lightmaps funktionieren einwandfrei und ich bin richtig begeistert, was so ein gutes Levelformat alles ausmachen kann 😃
    Den Test-Level habe ich mit dem Q3 Editor (Q3Radiant) erzeugt. Die dort eingebauten Lichtquellen sind ja statisch und werden über die erwähnten Lightmaps abgebildet. Standardmäßig erzeugt der BSP-Compiler von "Q3Radiant" Lightmaps in der Auflösung 128x128. Kann es sein, das nur eine Lightmap Textur erzeugt wird, die über die komplette Level-Geometrie gelegt wird ? Das ist mir beim Debugging mal so aufgefallen. Desweiteren hätte ich gerne Lightmaps in höheren Auflösungen (256x256 oder sogar 512x512) damit die Schatten richtig schick aussehen 🙂
    Frage 1: Kann man die Auflösung direkt bei Q3Radiant einstellen ?
    Frage 2: Wenn nicht, wie könnte man die 128x128 Lightmap auf höhere Auflösung skalieren (Per Programmcode beim Laden der Map) ?


  • Mod

    zu1: weiß ich nicht 😉
    zu2: hochskalieren wird nicht sonderlich viel bringen, weil die map von der graka ja automatisch skaliert wird beim rendern.
    hochskalieren würde nur was bringen wenn du mehr information verpacken würdest und nicht nur wie die graka skalierst. dazu müßtest du irgendwie die höcherauflösende map generieren.

    rapso->greetS();



  • Mit Skalieren meinte ich, das ich die gegebene 128x128 Lightmap irgendwie auf 256x256 vergrössere und diese vergrösserte Version dann weitergebe. Dazu bräuchte ich natürlich einen entsprechenden Algorithmus (welchen ich nicht habe). Diese Funktion muss die Lightmap natürlich "schicker" machen. Das heisst Ränder weichzeichnen etc und nicht einfach nur auf Pixelebene vergrössern. Das müsste doch was an Qualität herausholen können oder ?
    Was ich unschön finde, sind diese "gezackten" Schattenränder, wenn eine Lightquelle eine schräge Fläche trifft. Da sieht man dann schon, das die Lightmap doch (leider) sehr grobkörnig ist mit ihrer 128er Auflösung 😞


  • Mod

    du kannst dir ja selbst eine map in gewünschter auflösung generieren ;), raytrace einfach von jeder texelposition zu jeder lichtquelle und setze dann den texel als summe der lichtstärken aller lichtquellen auf die position wo sich der texel im 3draum befindet.

    für einen testlevel kannst du das sicherlich mal versuchen ohne viel optimierung beim raytracen.

    dann kannst du jede gewünschte lightmapgröße haben und mit soviel antialiasing arbeiten wie du möchtest für weiche schatten.

    einen algorithmuss der mehr informationen aus einer 128*128 map generiert um das dann in 256*256 zu zeichnen gibt es nicht wirklich. du kannst cubisch filtern oder versuchen eine fractale vergrößerung zu generieren. aber ob die dabei generierten daten soviel mehr an qualität brigen wage ich zu bezweifeln.

    rapso->greets();



  • Oh-ha!, eigenen Raytracer schreiben 😮 😃
    Ok, von der Lichtquelle einen "Strahl" zum anvisierten Texturpunkt führen und den jeweiligen Wert errechnen krieg ich wohl hin. Aber ich frage mich gerade, wie man aus diesen Werten dann eine Lightmap Textur erzeugt und vor allem: Wie diese dann auf die Map-Geometrie gelegt wird, so das es später auch passt 😃


  • Mod

    das problem hast du ja garnicht, die UV coordinaten hast du ja schon, weil deine ganzen levels ge-light-mapped sind.

    du mußt nun für jedes triangle in der map quasi die lichtmap zeichnen.
    dabei verwendest du die UV-coordinaten als xy-coordinaten zum zeichnen auf der lightmap, so als ob es ein normales rasterisieren eines triangles wäre.
    dabei traced du dann für jeden texel/pixel den du setzen möchtest durch die scene und errechnest die farbe, dafür kannst du also noch die world-xyz-coordinaten mitinterpolieren...

    ich hab mir sowas änliches für radiosity gemacht, aber anstatt zu tracen hab ich ne camera an die position gesetzt und ein screenshot gemacht :D, die summe der farben/anzahl der pixel hat dann die radiosität errechnet. das war aber leider noch mit dx8/opengl 1.2 und somit ohne floatingpoint buffer, weshalb es auch viele artefackte gab, dazu mußte ich dann noch die normale interpolieren, das wirst du wohl auch müssen, wenn du eine diffuse intensität errechnen möchtest.

    rapso->greets();



  • Hier gibts 'ne Liste mit den switches für den Map Compiler, hast du die schonmal alle probiert?

    http://qeradiant.com/manual/Terrain_Manual/pages/new_or_revised_q3map_shader_comm.html


Anmelden zum Antworten