Problem mit 3 dimensionalen Texturen (für Terrains)
-
Hallo,
ich bin gerade dabei in mein Programm 3 dimensionale texturen einzubauen.
Ich arbeite natürlich mit Mipmaps - sähe ja sonst hässlich aus - aber leider muss man - so wie es mit gluBuild3DMipmaps (http://pyopengl.sourceforge.net/documentation/manual/gluBuild3DMipmaps.3G.html) - auch die Tiefe der Texturen für jede MipMap Stufe verkleinene. Das hat zur Folge, dass wenn man sich von dem Terrain entfernt (oder einem anderen Objekt, welches eine 3D Texture hat) irgendwann nur noch die erste Texture (mit der Tiefe 0) zu sehen ist. Das ist sau dumm :p . Wie also kann man das verhindern, ohne auf das restliche MipMapping zu verzichten?
-
leider muss man [...] die Tiefe der Texturen verkleinern
Was genau meinst Du damit und warum ist das ein Problem fuer Dich?
-
glTexImage3D( GL_TEXTURE_3D, 0, InternalFormat, 32, 32, 4, // Width, Height, Depth Border, Format, ImageDataType, ImageData ); glTexImage3D( GL_TEXTURE_3D, 1, InternalFormat, 16, 16, 2, Border, Format, ImageDataType, ImageData ); glTexImage3D( GL_TEXTURE_3D, 2, InternalFormat, 8, 8, 1, Border, Format, ImageDataType, ImageData ); /* ... */ glTexImage3D( GL_TEXTURE_3D, 5, InternalFormat, 1, 1, 1, Border, Format, ImageDataType, ImageData );
Das Problem ist, dass auch die Tiefe der Texture (Tiefe natürlich nur bei 3D Texturen) beim Generieren von MipMaps für jede MipMapStufe halbiert werden muss.
Ich will aber MipMaps generieren bei denen die Tiefe unverändert bleibt, oder aber es soll nicht beim Rendern die MipMap Stufe der Tiefe ausgewählt werden.
-
Dann moechtest Du evtl gar keine Volume-Maps sondern Texture Arrays.
-
Wozu werden denn dann 3D Texturen verwendet??
-
Normalerweise für solid texturing, d.h. wenn die Texturkoordinaten nicht durch Berechnung der uv-Koordinaten gewonnen werden sondern direkt aus den xyz-Koordinaten eines Punktes. Zum Beispiel könnte man so darstellen wie es aussieht, wenn man Scheiben von ner Salami abschneidet.
Vielleicht könntest du dir auch nen tomographierten 3D-Datensatz von nem Gehirn runterladen und dann verschiedene Formen rausschneiden
Aber bei Echtzeitanwendungen finde ich ist der Anwendungsbereichnicht so groß. Beim Nicht-Echtzeitrendering werden prozedurale Texturen oft als solide d.h. 3D-Texturen erzeugt, was auch das Problem des enormen Speicherbedarfs einer 3D-Bitmap vermeidet.
geloescht
-
Mhh, meine 3D Engine kann zwar MultiTextureing, aber eignet sich das alleine denn gut für Terrains? Ich meine, in Spielen wie die Sims2 z.B. kann man den Rasen editieren, d.h. also, dass jedes Vertex über die Information einer beliebigen Texture verfügt. Ich dachte, dafür liesen sich 3D Texturen einsetzten. Also wenn nicht damit wie dann? Wie funktionieren denn Texture arrays? Die PDF Datei hat mir nicht so sehr viel geholfen. Wie sähe denn sowas in OpenGL oder Direct3D9 aus?
-
Schau doch mal in die Spezifikation von EXT_texture_array.
-
Also mal abgesehen von den anderen Tips hier, wie kommst du eig drauf das sich die Tiefe auch halbiert? Die gibt ja imerhin die Anzahl der hintereinanderliegenden Texturen an, würde die Tiefer verkleienrt werden dann hätetst du ja automatisch weniger Texturen hintereinander, oder sehe ich da was total falsch?
-
wie kommst du eig drauf das sich die Tiefe auch halbiert?
Weil es da steht und anders keinen Sinn ergaebe.
-
hellihjb schrieb:
wie kommst du eig drauf das sich die Tiefe auch halbiert?
Weil es da steht und anders keinen Sinn ergaebe.
fuer viele dinge wuerde es sinn ergeben, was dieser thread schon beweist
aber man kann es auch texture-array nennen
-
aber man kann es auch texture-array nennen
Man sollte es aber auf keinen Fall Mipmapping nennen :p
Wenn man 2D-Texturen verwendet wundert man sich ja auch nicht, dass die Mipmap-Stufe in beide Dimensionen kleiner wird
(auch wenn es anders manchmal durchaus sinnvoll waere)
-
hellihjb schrieb:
wie kommst du eig drauf das sich die Tiefe auch halbiert?
Weil es da steht und anders keinen Sinn ergaebe.
Naja wenn man wie ich, und Lukas wohl auch, davon ausgeht das die tiefe eine ganz andere bedeutung hat dann macht es schon sinn. Ich sehe die tiefe der Textur einfach als Array an. Die Tatsache das es anders ist macht wohl auch das Rechnen mit der Tiefe sinnlos, da wäre man wohl besser dran man macht nen richtiges Array und interpoliert damit.
-
Auch in dem Spiel "FarCry" ist der Übergang von Sand zu Grass irgendwie mit Texture Arrays oder sowas gemacht. Mit Multitexturing lässt sich das nicht vernünfitg lösen. Im "Sandbox Level Editor" kann man pro Dreieck die texture ändern und der Übergang wird automatisch dargestellt.
Wie funktioniert das denn mit Texture arrays? In OpenGL oder Direct3D9?
-
als farcry gemacht wurde, gab es glaube ich noch keine texture arrays, das spiel laeuft ja noch auf geforce4 karten, da gab es gerade mal pixelshader 1.4
-
Mit Multitexturing lässt sich das nicht vernünfitg lösen
TextureArrays sind doch effektiv nur ein Automatismus.
Du kannst genau so gut in mehreren Passes zwischen den (im einfachsten Fall jeweils zwei) Textur-Ebenenen interpolieren und per Alpha-Blending mit den bereits existierenden Ebenen verrechnen.Wie funktioniert das denn mit Texture arrays?
In der Spec steht doch alles drin.
Eine dritte Texturkoordinate (die zb aus einer geeigneten "Alpha"-Map kommt) definiert, welche Texturebene benutzt wird (sowie die Gewichtung zwischen zwei Ebenen).