nach laaaangen Jahren der Abstinenz dachte ich mir, ich spiele mal wieder mit OpenGL herum (daher erstmal ein Hallo an alle ). Als ich dann zu dem Punkt Texturen, Umgang mit Ressourcen und Kosten von State-Changes in OpenGL nachdachte, viel mir irgendwie Minecraft ein. Und ich frage mich da gerade - wie geht Mincraft eigentlich intern mit dem Texturenmanagement um? Ich meine, man kann ja alle möglichen Blöcke mit unterschiedlichen Texturen nebeneinander setzen.
Wechselt Minecraft jedesmal die Textur? Werden für die sichtbaren Bereiche alle Blöcke nach Textur sortiert? Oder klatschen die ganze Armeen von diesen kleinen Texturen zu einer großen zusammen (was ich mir angesichts der Größe diverser Texture-Packs kaum vorstellen kann). Oder ist genau das einer der Ursachen (neben Java), für FPS?
Habt ihr da ne Ahnung oder zumindest eine Idee?
Gruß Marc
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Einige Möglichkeiten hast du ja schon genannt. Es gibt noch weitere. Beispielsweise kann man mehrere Texturen gleichzeitig binden (Multitexturing) und im Shader eine davon auswählen. Und wenn es etwas moderner sein darf, gibt es sogar das Konzept der Bindless Textures (wobei ich bezweifle, dass Minecraft das nutzt).
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Das mit dem Multitexture hatte ich mir auch schon überlegt. Ist es wirklich normale Verwendung, per Shader dann die passende Textur heraus zu suchen oder gleicht das mehr einem Hack? Und apropos Shader (ist zugegeben etwas Off-Topic): ist es eher unpraktisch verschiedene Pfade per if im Shader zu haben (also z. B. if (flag x set) user textureunit x for blending; if (flag y set) calc extra lighning stuff) oder wäre für solch spezielle Shader besser?
_________________ Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Für das Multitexturing würde ich keine if-Verzweigungen im Shader einbauen. Eher würde ich Gewichte für jede Textur per Uniform bzw. Vertex-Attribut mitgeben. Dann wählst du eine Textur aus, indem du ihr das Gewicht 1.0 gibst und alle anderen mit 0.0 ausschaltest. Ungefähr so:
Code:
vec4 sampleTexture(){// ungetesteter Code
vec4 rgba =vec4(0.0);
rgba += texture(tex1, texCoords)* weight1;
rgba += texture(tex2, texCoords)* weight2;
rgba += texture(tex3, texCoords)* weight3;
rgba += texture(tex4, texCoords)* weight4;
return rgba;
}
Übershader (das ist tatsächlich ein englischer Fachbegriff) zu schreiben, ist nicht unüblich. Allerdings würde ich versuchen, möglichst wenige Laufzeit-ifs zu verwenden. Stattdessen lieber mit #ifdef arbeiten und mittels #define den jeweiligen Code-Pfad zur Compilezeit vorgeben. Dann kompiliert man den Shader mehrmals mit jeweils unterschiedlichen #defines
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Ich bin mir ziemlich sicher das Minecraft einen Texture Atlas benutzt, damit fallen state changes weg und die komplette Adressierung bzw. das Überlagern, etc. wird dann im Shader gemacht.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.