Fragen zu Multitexturing/ Lightmaps und Texture-Baking



  • AFAIK ist es zumindest bei Half-Life so gewesen, dass das Einschussloch ein eigenes Quad ist, was ganz knapp vor der Wand platziert wird und so den Eindruck erweckt, draufzuliegen. Was man - je nach Qualität der Graka und des Treibers - auch oft am Z-Fighting sah.



  • Genau, wenn das nämlich zu nah anliegt sieht das ziemlich blöd aus, weil sich die Dreiecke überlappen.
    Aber wenn man in Half-Life 1 an eine Kante schießt legt sich das 'Loch' bzw. 'Quad' um die Ecke herum 😮
    Wie soll man das mit einem Quad machen? 😕



  • Das Quad als Pyramide mit quadratischer Grundflaeche betrachten (die Spitze entspricht der "Schussposition") und mit der Geometrie schneiden.
    Entspricht Sutherland/Hodgman 3D-Clipping im View-Frustum.



  • ZEIT SPRUNG ^^

    Ich hab mich jetzt schon ziehmlich lange nicht mehr mit dem Thema Lightmaps auseinander gesetzt, aber dafür wurde mir eben gerade das mit dem Tiefen-Test erst wirklich richtig klar (Geistesblitz ^^)

    Für mein aktuelles Projekt habe ich diesmal mit dem Editor angefangen, damit ich damit auch die Test-Level gestalten kann um die Engine zu testen.
    Es soll natürlich ein EgoShooter werden 🙂 und dafür will ich unbedingt einen LightmapGenerator integrieren.

    Was ich dazu bisher in Erfahrung bringen konnte war, dass es was mit dem "Radiosity" Algorithmus zu tun hat der schon in Quake3 und sehr wahrscheinlich auch in Half-Life 1 genutzt wurde.

    Allerdings habe ich dazu bisher nur ein Tutorial gefunden, und weil das recht "schwere Kost" ist, wollte ich euch fragen, ob ihr noch ein paar andere kennt, vielleicht auch gleich welche mit C++ oder OpenGL Code Beispielen?

    Hier ist der Link den ich bisher dazu gefunden habe:
    http://www.flipcode.com/archives/Light_Mapping_Theory_and_Implementation.shtml



  • Google mal nach "global illumination".


  • Mod

    quake2 hatte radiosity, in quake 3 sind es wieder simple lightmaps geworden weil sie schneller zu berechnen sind und die artist lieber mit lichtquellen kontrolle darueber haben.
    HL1 basierend auf Q1 hat wohl keine radiosity maps, HL2 hat wieder radiosity maps.

    ich finde es immerwieder erstaunlich wieviel du zusammenhackst ohne die grundlagen zu verstehen 😉
    software rasterizer schreiben aber tiefentest erst jetzt verstehen? respekt *hehe*



  • Naja das Grundkonzept vom Tiefentest war mir schon klar - zugegebener Weise allerdings wirklich nicht zu Beginn der Arbeit an meiner 3D Engine XD - jedoch funktioniert mein Versuch, mit OpenGL glDepthFunc(GL_EQUAL) doch nicht so wie ich mir das vorgestellt hatte.
    Die Pixel werden zwar nur dann angezeigt wenn sie gleich groß sind wie die des hintergrundes, aber dafür flackert das ganze immer noch so wie im normal Fall, weil die Dreiecke Überlappen. Vermutlich weil die Berechnung nicht genau genug ist.
    Genau weiß ich es aber nicht.

    Noch mal zu den Lightmaps, wenn HL1 keine Radiosity maps hat, was hat es dann? Die arbeiten doch auch mit Multitexturing und Lightmaps, oder?! Oder gibt es dafür noch eine andere Methode zum generieren der Lightmaps?


  • Mod

    LukasBanana schrieb:

    Naja das Grundkonzept vom Tiefentest war mir schon klar - zugegebener Weise allerdings wirklich nicht zu Beginn der Arbeit an meiner 3D Engine XD - jedoch funktioniert mein Versuch, mit OpenGL glDepthFunc(GL_EQUAL) doch nicht so wie ich mir das vorgestellt hatte.
    Die Pixel werden zwar nur dann angezeigt wenn sie gleich groß sind wie die des hintergrundes, aber dafür flackert das ganze immer noch so wie im normal Fall, weil die Dreiecke Überlappen. Vermutlich weil die Berechnung nicht genau genug ist.
    Genau weiß ich es aber nicht.

    ja, da haste recht (natuerlich kann es nen anderen grund geben, aber dieser ist wahrscheinlich).
    du musst EXACT die selbe geometrie und die selben shader (falls du shader benutzt) ausfuehren, damit auch das selbe resultat rauskommt, dann wird es kein z-fighting geben.

    Noch mal zu den Lightmaps, wenn HL1 keine Radiosity maps hat, was hat es dann? Die arbeiten doch auch mit Multitexturing und Lightmaps, oder?! Oder gibt es dafür noch eine andere Methode zum generieren der Lightmaps?

    die haben nur simple shadows in ihre lightmaps gerechnet.

    deine arbeit besteht im grund aus 2 wichtigen schritten.
    1. jedes dreieck das eine lightmap bekommen soll muss eine einzigartige stelle auf der lightmap-textur bekommen,also: es duerfen keine zwei dreiecke den selben pixel nutzen (wenn auch man spaeter ein wenig optimieren kann, waere es wichtig es erstmal so einfach hinzubekommen).

    2. die lightmaps berechnen. im simpelsten fall kannst du bei jedem dreieck, fuer jedes pixel der lightmap die kamera an diese stelle setzen (richtung normale schauend) und renderst ein bild.
    dann nimmst du die durchschnittshelligkeit aller pixel und setzt diese in die lightmap.
    wichtig ist:
    -alle lightmaps sind zu begin schwarz initializiert
    -die lightquelle muss mit eingezeichnet werden beim rendern, weil sie das einzige helle objekt ist.

    wenn du nun radiosity willst, berechnest du das ganze nochmal mit den schon neuen lightmaps.



  • Alles klar, das mit den Lightmaps generieren habe ich jetzt glaube ich einiger maßen verstanden. Allersings kann ich mir noch nicht ganz vorstellen, wie ich die Kamera auf dem Dreiecke für jeden Pixel positionieren muss. Normale ist klar, aber wie viel Pixel brauche ich wohl für das jeweilige Dreiecke?!
    Oberfläche / 100 = Anzahl Pixel ?!?

    Und noch mal wegen dem Tiefen Test:
    wenn man das mit der selben Geometrie verwendet sieht das gut aus.
    Aber wie muss man das machen, um es für beispielsweise die Einschusslöcher in einer Wand zu nutzen
    (http://www.hlportal.de/images/images/original/2040.jpg,
    http://img163.imageshack.us/img163/4884/parallaxmappingfearkleinxb9.jpg)
    Das frage ich mich auch schon seit Ewigkeiten. Das kann doch gar nicht über mutitexturing gehen, oder?!
    Ich habe mir sowas in einigen Spielen genau angesehen, selbst ich alten Spielen wie HL1 liegen diese Pixel genau auf der Oberfläche und nicht mit einem minimalen Abstand von 0.0001, das würde dann nämlich auch sehr schnell zu Grafikfehlern füren.

    Kann mir das vielleicht auch mal jemand gleich dazu erklären?



  • Wie werden denn diese Einschusslöcher dargestellt?
    Ich gehe mal davon aus, dass es sich um Quads (also zwei Dreiecke) handelt, aber wie funktioniert das, dass diese Pixelgenau auf dem Untergrund liegen. In HL1 ist mir das schon oft aufgefallen, diese Einschusslöcher haben nicht den geringsten Abstand zum Untegrund (Wand, Boden etc.).
    Wie macht man das?? Und wie bekommt man es hin, dass diese auch noch mit dem Hintergrund-Pixeln Multipliziert werden?
    Sieht man hier recht gut:
    http://img163.imageshack.us/img163/4884/parallaxmappingfearkleinxb9.jpg
    Kann mir das jemand erklären?? 😕



  • wie funktioniert das, dass diese Pixelgenau auf dem Untergrund liegen.

    Theoretisch pappst Du ein Quad an die Wand und setzt den Z-Test auf "Equal" - funktioniert in der Praxis wegen Rundungsabweichungen aber nicht.
    Stattdessen schiebst Du die Geometrie minimal nach vorne (Normale) und zeichnest mit "Less/Equal".
    Genanntes "Quad" ist in der Realitaet ein Ausschnitt der getroffenen Geometrie.

    LukasBanana schrieb:

    wie bekommt man es hin, dass diese auch noch mit dem Hintergrund-Pixeln Multipliziert werden?

    Blending aktivieren.


Anmelden zum Antworten