3D Mip-Map

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Hallo alle zusammen!

      Ich hätte da eine Frage bezüglich der 3D Techkick "Mip-Mapping".
      Bei dieser werden Texturen (auf 2er Potenzen) runterskaliert um Aliasingeffekte zu vermeiden.

      Das Problem ist nur, dass ich im Internet nicht wirklich eine sinnvolle erklärung finden WIE genau das ganze funktioniert.
      Je größer die Entfernung von der Kamera zum Objekt, desto kleiner die Mipmap? Sprich: Je weiter das Objekt weg ist, desto "schwammiger" wird die Textur?

      Grundsätzlich sol ldas ja auch zu einer besseren Performance führen, da kleiner aufgelöste Texturen weniger Ressourcen verbrauchen, aber im Falle des GMs könnte das evtl nur zu performanceverschlechterung führen,
      da man ja die Entfernung von der Kamera bis zu den jeweiligen Objekten immerwieder berechnen muss. (Es sei denn man berechnet pro step nur die entfernung von einer Handvoll objekte...)

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von LEWA ()

    • In der aktuellen Version des GM's gibt es die Funktion point_distance_3d() damit kann man relativ schnell die Distanz zwischen zwei Punkten berechnen. Du musst sowas ja auch nicht zwangsläufig jeden Step machen sondern vieleicht nur alle 10 oder so.

      Das Prinzip ist infach, man wählt je nach Abstand eine andere Textur aus.
      Im Game Maker geht das auch relativ einfach da Modelle nie direkt mit der Textur verknüpft sind. Von daher kannst du in den draw events alles so lassen wies war und einfach die textur-veriable nach Bedarf ändern. Solch eine Variable hast du höchstwahrscheinlich schon da man die _get_texture Funktionen niemals jeden step aufrufen sollte (einfach sinnlos und braucht gewisse Rechenzeit).

      Im step event errechnest du einfach die Distanz zur Kamera und weist der Texturvariable (aus dem draw event) die Textur in der jeweils richtigen Größe zu.

      Keine Ahnung ob du dies gefunden hast, aber es gibt hier ein recht simples example: gmc.yoyogames.com/index.php?showtopic=408686
      Allerdings geht es da um terrain und es wird die map für jedes einzelne Polygon berechnet weswegen beim aktivieren des "Mipmappings" die maximal mögliche fps-Zahl um etwa die Hälfte sinkt.
      Bei ganzen modellen bei denen man, wie erklärt, schlicht die Textur des gesamten Models wechselt, sollte es kaum Performance-Nachteile geben.
      Bin mir grad aber auch nicht sicher ob das irgendwelche positive Efekte in der Performance haben kann (wegen der Grafik lohnt es sich aber oftmals dennoch). Zwar benötigt eine kleinere Textur weniger Speicher, aber auf den Bildschirm müssen genauso viele Polygone texturiert werden. Nehme stark an das letzteres viel viel mehr der Performance ausmacht...


      EDIT:
      Der Ersteller des examples hat an der entscheidenden Stelle ziemlich unperformanten code gschrieben -_-
      Wenn man im draw_terrain script an der entsprechenden Stelle den code durch diesen ersetzt:

      GML-Quellcode

      1. if mip
      2. {
      3. k = point_distance((ggg*10)*96,(hhh*10)*96,obj_camera.x,obj_camera.y);
      4. switch(true)
      5. {
      6. case (k<2000): d3d_model_draw(ds_grid_get(models,ggg,hhh),0,0,0,tex_mip_lvl_1); break;
      7. case (k<4000): d3d_model_draw(ds_grid_get(models,ggg,hhh),0,0,0,tex_mip_lvl_2); break;
      8. case (k<8000): d3d_model_draw(ds_grid_get(models,ggg,hhh),0,0,0,tex_mip_lvl_3); break;
      9. default: d3d_model_draw(ds_grid_get(models,ggg,hhh),0,0,0,tex_mip_lvl_4); break;
      10. }
      11. }
      Alles anzeigen

      dann verringert sich der fps-Absturz durch das mipmaping auf nur ~10-15%. Definitiv ausreichend schnell würde ich sagen.

      Willst du auf diese Drachen und -eier klicken?
      Sie werden sich freuen ;)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von DragonGamer ()