Um mein "Sternen-Objekt" zu optimieren, würde ich gerne schon beim generieren schauen, ob in der Cubemap, die ich verwende und welche auf GPU erzeugt wird, Nebel vorhanden ist um dann die Sterne entsprechend dicht zu erzeugen.
Da ich ziemlich viel Speicher verbrauche und nun auf Suche gegangen bin, hab ich gesehen, dass vor allem die Sterne ziemlich viel brauchen, weil ich diese sehr dicht erzeuge und dann im Shader da weg blende, wo kein Nebel ist (zumindest so, dass sie da weniger Dicht erscheinen).
Nun hab ich mir gedacht, ich lade die Cubemap auf CPU runter, soweit bin ich auch schon. Nun müsste ich aus den 6 x 2D Texturen die Richtige Stelle sampeln. Also müsste ich die Richtung, die der Stern hat und die eigentlich direkt aus der Cubemap gelesen würde, auf die 6 Texturen ungemappt werden. Weiß jemand wie das geht? Ich meine vor vielleicht 2 Wochen oder so mal was in der Richtung gesehen zu haben und da war es wohl ganz einfach. Aber ich kann mich nicht mehr erinnern und würde mir da Mathematisch ganz schön einen abbrechen.
[DX9] Cubemap Koordinaten in 2D umrechnen
- Krishty
- Establishment
- Beiträge: 8244
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [DX9] Cubemap Koordinaten in 2D umrechnen
Eigentlich sehr einfach:
Du findest zuerst die Komponente mit dem größten Betrag, also max(abs(x), abs(y), abs(z)). Diese Komponente gibt die Würfelfläche vor, also bei D3D AFAIK die erste Fläche für +X, dann -X, usw.
Um auf dieser Fläche die 2D-Koordinaten zu berechnen teilst du die anderen beiden Koordinaten durch diese größte Koordinate. Dann erhälst du was von -1 bis +1, und das mappst du auf die Texel. Wie die einzelnen Flächen jetzt rotiert sind, (ob auf der Y-Fläche die Hochachse X oder Z bedeutet) musst du in der MSDN nachforschen.
Du findest zuerst die Komponente mit dem größten Betrag, also max(abs(x), abs(y), abs(z)). Diese Komponente gibt die Würfelfläche vor, also bei D3D AFAIK die erste Fläche für +X, dann -X, usw.
Um auf dieser Fläche die 2D-Koordinaten zu berechnen teilst du die anderen beiden Koordinaten durch diese größte Koordinate. Dann erhälst du was von -1 bis +1, und das mappst du auf die Texel. Wie die einzelnen Flächen jetzt rotiert sind, (ob auf der Y-Fläche die Hochachse X oder Z bedeutet) musst du in der MSDN nachforschen.
Re: [DX9] Cubemap Koordinaten in 2D umrechnen
Wow! Das hört sich wirklich einfach an. Ja letzteres denke ich dann, lässt sich durch try&error schnell raus bekommen. Danke! :D
Re: [DX9] Cubemap Koordinaten in 2D umrechnen
:o
Ich habe mich gerade dran gesetzt und es hat ALLES auf Anhieb geklappt... das ist erschreckend unheimlich!
Also wie du sagst, absolute größte Koordinate, finden. Damit hat man schon mal X, Y und Z. Am einfachsten geht dies, wenn man X, Y, Z schon mit 0, 1, 2 als Vektor nummeriert hat. Dann einfach für die Seite mal 2 rechnen und falls die Koordinate negativ ist noch 1 addieren für die Würfelseite. Für die Texturkoordinate alle Werte teilen, das ganze *0.5+0.5 und bei X: ZY, Y: XZ und Z: XY benutzen. Ich dachte, da müsste man dann noch was spiegeln oder so, man muss ja immer ein bisschen fuckeln, bis das bei den Cubemap passt. Aber hier war es das schon. Krass.
Jetzt muss ich das nur noch umbiegen, damit das bei der Objekterstellung mit einfließt. Ich hoffe mal, dass das auch so Reibungslos klappt.
Testweise hatte ich nun die Cubemap in einzelne 2D-Texturen geschrieben, die dann ausgelesen und Zufallssterne generiert als 3D Vektoren. Diese werden dann auf die Texturen umgemappt. Da wird dann die Helligkeit ermittelt und dann mit einem Zufallswert verglichen. Ist der Test positiv, wird dann der Stern in die Textur geschrieben. Damit das nicht so übersteuert und ich noch was vom Nebel sehen kann, nur mit schwacher Helligkeit. Hier noch ein Bild von dem Ergebnis... eine Seite als repräsentatives Beispiel:
Ich habe mich gerade dran gesetzt und es hat ALLES auf Anhieb geklappt... das ist erschreckend unheimlich!
Also wie du sagst, absolute größte Koordinate, finden. Damit hat man schon mal X, Y und Z. Am einfachsten geht dies, wenn man X, Y, Z schon mit 0, 1, 2 als Vektor nummeriert hat. Dann einfach für die Seite mal 2 rechnen und falls die Koordinate negativ ist noch 1 addieren für die Würfelseite. Für die Texturkoordinate alle Werte teilen, das ganze *0.5+0.5 und bei X: ZY, Y: XZ und Z: XY benutzen. Ich dachte, da müsste man dann noch was spiegeln oder so, man muss ja immer ein bisschen fuckeln, bis das bei den Cubemap passt. Aber hier war es das schon. Krass.
Jetzt muss ich das nur noch umbiegen, damit das bei der Objekterstellung mit einfließt. Ich hoffe mal, dass das auch so Reibungslos klappt.
Testweise hatte ich nun die Cubemap in einzelne 2D-Texturen geschrieben, die dann ausgelesen und Zufallssterne generiert als 3D Vektoren. Diese werden dann auf die Texturen umgemappt. Da wird dann die Helligkeit ermittelt und dann mit einem Zufallswert verglichen. Ist der Test positiv, wird dann der Stern in die Textur geschrieben. Damit das nicht so übersteuert und ich noch was vom Nebel sehen kann, nur mit schwacher Helligkeit. Hier noch ein Bild von dem Ergebnis... eine Seite als repräsentatives Beispiel:
Re: [DX9] Cubemap Koordinaten in 2D umrechnen
Das ganze für die Sternenkugel klappt irgendwie noch nicht... wahrscheinlich muss ich da jetzt doch irgendwo was vertauschen. Also doch fuckeln... :D
Bei einem Standbild sieht man schlecht, dass die Sterne nicht bündig sind. Aber am Himmel sieht man auch, dass die Sterne nicht zum Nebel passen.
Bei einem Standbild sieht man schlecht, dass die Sterne nicht bündig sind. Aber am Himmel sieht man auch, dass die Sterne nicht zum Nebel passen.
Re: [DX9] Cubemap Koordinaten in 2D umrechnen
Gut, nun klappt es... aber ich musste seltsamerweise wirklich ein paar Koordinaten flippen...
Überall wo die "1-" vor steht.
Danke nochmal Krishty für die schnelle Antwort zu Anfang! :D
Überall wo die "1-" vor steht.
Code: Alles auswählen
case _f of
0: begin sx:=1-(_dir.z*cm+0.5); sy:=1-(_dir.y*cm+0.5); end;
1: begin sx:=1-(_dir.z*cm+0.5); sy:= (_dir.y*cm+0.5); end;
2: begin sx:= (_dir.x*cm+0.5); sy:= (_dir.z*cm+0.5); end;
3: begin sx:=1-(_dir.x*cm+0.5); sy:= (_dir.z*cm+0.5); end;
4: begin sx:= (_dir.x*cm+0.5); sy:=1-(_dir.y*cm+0.5); end;
5: begin sx:= (_dir.x*cm+0.5); sy:= (_dir.y*cm+0.5); end;
end;