Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

05.02.2010, 16:28

Brauche etwas Hilfe bei LightmapGenerierung

Hi,
ich arbeite derzeit an einem LightmapGenerator für meine 3D Engine - dieses Tool steht dann übrigens jedem frei zur Verfügung :D

Bisher funktioniert die LightmapGenerierung auch schon ganz gut.
Jedes Face (Face -> Liste zusammenhängender Dreiecke in der gleichen Axis; Axis -> 6 Axles: +X, -X, +Y, -Y, +Z, -Z) hat seinen eigenen (rechteckigen) Platz in der Lightmap-Texture.
Mein Problem ist jetzt allerdings, dass, auf Grund der Texel-Interpolierung der Grafikkarten (linear texture filter), am Rand eines jeden Faces bzw. am Rand der im Face außenliegenden Dreiecke die Farblichen Übergänge der drumherum liegenden LightmapTeile zu sehen ist.
D.h. also dass am Rand einer Dunklen Stelle auf einmal ein heller Teil zu sehen ist. Auch wenn außenrum kein weiteres Face in der Lightmap plaziert ist, dann sieht man eben das Schwarz wo die Lightmap unbenutzt ist.
Egal wie, es sieht immer am Rand hässlich aus.

Da ein Bild mehr als tausend Worte sagt, habe ich mal einen Screenshot davon hochgeladen um euch zu zeigen, was da nicht so gut funktioniert.
(Auf dem Bild sind die Texels noch nicht verschwommen, aber nur zu demonstrationszwecken)


(Link)


Ich habe schon überlegt, ob ich nicht einfach den Platz für jedes Face auf Lightmap um 2 Pixel in die Breite und Höhe vergrößere, sodass ich die selbe Pixelfarbe der Ränder noch mal am Rand rendern lasse, aber ich weiß nicht genau wie ich das umsetzen soll und ob das überhaupt die geschickteste Methode ist.

Ich hoffe ich könnt mir da etwas weiter helfen.
Bis dann und schon mal Danke =)

Gruß,
Lukas

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

2

05.02.2010, 16:43

Zitat

Ich habe schon überlegt, ob ich nicht einfach den Platz für jedes Face auf Lightmap um 2 Pixel in die Breite und Höhe vergrößere


Prinzipiell so macht das auch jeder profesionelle Engine.

Wo du allerdings auch drauf achten musst (kann man dem Screenshot nicht entnehmen) ist, dass niemals zwei Kannten senkrecht aufeinander stehen. Sprich eine Säule im Mitte vom Raum zum Beispiel. In dem Fall müssen die Schnittpunkte zwischen Säule und Decke/Boden ermittelt und aus der Decke, dem Boden sowie der Säule die sich schneidenden Flächen entfernt werden, sonst gibt's nämlich da auch Flecken :-). Kurz und knapp alles boolisch kombinieren, damit man am Ende eine geschlossene Hülle erhält.

LG
Alyx

p.s. Sieht gar nicht mal schlecht aus. :-)

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

05.02.2010, 18:44

Dein "Säulen" Beispiele kenne ich. Das wäre noch ein zweites Problem, aber mit dem kann man im Grunde auch leben, das würde nicht so oft auftreten, aber Ersteres ist wichtiger - wie ich finde.

Wie genau aber macht man das am besten, die Randpixel nach Außen zu erweitern?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

05.02.2010, 19:39

Cool :)

Hier gibts ein gutes Tutorial wo unter anderem auch dein bleeding Problem angesprochen wird: http://www.flipcode.com/archives/Light_Mapping_Theory_and_Implementation.shtml

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

05.02.2010, 20:02

Danke, das hat mir von der Idee her geholfen =) bzw. jetzt hab ich wieder einen neuen Ansatz den ich als nächstes ausprobeiren kann ^^

Zitat von »"dot"«

Cool :)


Galt das meinem Vorhaben, dass der LightmapGenerator bald der Öffentlichkeit zur Verfügung steht? ^^

Gruß,
Lukas

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

05.02.2010, 20:54

Zitat von »"LukasBanana"«

Galt das meinem Vorhaben, dass der LightmapGenerator bald der Öffentlichkeit zur Verfügung steht? ^^


jop ;)

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

7

05.02.2010, 22:41

Zitat von »"LukasBanana"«

Dein "Säulen" Beispiele kenne ich. Das wäre noch ein zweites Problem, aber mit dem kann man im Grunde auch leben, das würde nicht so oft auftreten, aber Ersteres ist wichtiger - wie ich finde.

Wie genau aber macht man das am besten, die Randpixel nach Außen zu erweitern?


Beim Einfügen in die Atlas-Textur das Pixel an den Textur-Grenzen freihalten und natürlich auch zu den anderen Lightmaps und anschließend das Ganze Bild durchlaufen mit "if Pixelwert = Initialwert und eines der 9 Nachbarpixel!=Initialwert, dann Pixel = Nachbarpixel".
Der Initialwert könnte zum Beispiel 0,0,0 sein. Du musst dann beim Berechnen der Lightmaps natürlich noch abfragen if Lichtwert==0,0,0 dann Lichtwert=0,0,1, um dann dort unterscheiden zu können.

EDIT: Du musst dabei aber in ein neues Bild kopieren, da sich die Linien sonst durchziehen würden.

Bzgl. der Säulen: Du wirst dich wundern ;-). Je nach Auflösung der Lightmaps gibt das richtig fiese Flecken, wenn das Texel hauchdünn in der Säule an der Decke sitzt und dadurch zwar eigentlich 99%ig beleuchtet sein sollte, aber dadurch, dass genau das 1% getestet wird, das 0 Licht abbekommt, hast du dann dort plötzlich einen tiefschwarzen Fleck im sonst sonnendurchfluteten Raum :-). Also da geht... leider kein Weg dran vorbei. Ich hab das zugegebenermaßen auch noch nicht programmiert, aber mir wirds bald ähnlich gehen... vielleicht können wir uns da ja zusammen tun :-P.

LG
Alyx

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

8

06.02.2010, 10:34

Zitat von »"Alyx"«

vielleicht können wir uns da ja zusammen tun :-P.


Gerne :)
Wie gesagt, ich werde das Tool jetzt erst mal fertigstellen und wenn es soweit ist und ich die neue Version meiner 3D Engine release steht das jedem frei zur Verfügung, sodass man sich da auch Ideen der Umsetzung rausholen kann - oder man nutzt ganz einfach meine 3D Engine ^^ - ich weiß nämlich wie schwer es ist, sich in den Programmcode anderer reinzudenken, bis man da was richtig versteht xD

Wenn das draußen ist, kann ich natürlich trotzdem weitere Hilfe gebrauchen. Vielleicht baue ich dann irgendwann auch das Feature "Radiosity" ein.

Das wär doch mal cool, einfach nur ein Flag auf True setzen und schon hat man Radiosity :lol:

Gruß,
Lukas

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

9

06.02.2010, 11:35

Also meine Funktion ReduceBleeding funktioniert schon sehr schön =)

Hier mal ein neues DemoBild mit neuer Szene:


(Link)


Jetzt kommt im Grunde nur noch die Optimierung durch OctTrees, die lohnt sich aber erst, bei richtig großen Szenen, vorallem weil Licht - egal wie schwach - im Grunde immer sehr weit kommt.

Nimmt man es ganz genau, erreicht Licht immer jeden Punkt, sonst könnten wir ja die Sterne nicht sehen xD
Aber das ist für einen einfachen LightmapGenerator etwas zu viel verlangt ^^

Gruß,
Lukas

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

10

06.02.2010, 12:00

Jein :-P. Die Sterne sehen wir ja, weil das Licht fast nur durchs Vakuum geht und die Lichtquelle quasi fast unendlich viel Energie hat, wohin gegen ne Taschenlampe sicherlich nicht unendlich weit strahlt ;-).

Octtrees.... hm.... lohnt nicht unbedingt denk ich, wenn die sonstige Objekthierachie stimmt. Wenn man natürlich 200x200m² aus einem Editor importieren würde dann klar, dann kommt man nicht drumrum bzw. sparts definitiv ne Menge :-).

LG
Alyx

Werbeanzeige