Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Aug 17, 2019 19:18

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Feb 13, 2019 03:22 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Hi Leute,

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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 13, 2019 13:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 570
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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 13, 2019 21:19 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
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?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Feb 13, 2019 22:34 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 570
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:
  1. vec4 sampleTexture() {  // ungetesteter Code
  2.   vec4 rgba = vec4(0.0);
  3.   rgba += texture(tex1, texCoords) * weight1;
  4.   rgba += texture(tex2, texCoords) * weight2;
  5.   rgba += texture(tex3, texCoords) * weight3;
  6.   rgba += texture(tex4, texCoords) * weight4;
  7.   return rgba;
  8. }


Ü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)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Feb 15, 2019 09:24 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5811
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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.034s | 17 Queries | GZIP : On ]