Jump to content
Unity Insider Forum

Zer0Cool

Members
  • Content count

    1,865
  • Joined

  • Last visited

  • Days Won

    132

Status Replies posted by Zer0Cool

  1. Mann hätte es auch anders machen Können,

    Aber ich bin zufrieden. Edlich hat das Raten ein Ende :D
    Kuxiis Modellbahn Besitz-Katalog,

    oder wie auch immer das nennen sollte xD

    http://trainbase.nuclear-gaming.de

    Screenshot_1.thumb.png.3ed2b8703297f69a555e9cb60d5f7550.png

  2. Ich bin ja immer auf der Suche nach hilfreichen Shadern und Tools. Wer ein fließendes Gewässer in sein Spiel einbauen möchte steht denke ich vor einigen Herausforderungen. Zum einen soll es halbwegs natürlich Ausehen aber eben auch nicht viel Performance fressen (siehe Water Assets von Unity).

    Zudem brauch man auch nicht immer gleich einen ganzen Ozean. Oft möchte man nur kleine Tümpel, kleine Flüsse oder einen Wasserfall visualisieren. Wenn die Lösung dann nichts kostet umso besser.

    Folgenden kleinen Fluss (aus der Demoszene) ist mit einem Shader des Tools "Vertex Painter" erstellt. Diesen kleinen Fluss habe ich zudem um eine Reflectionmap angereichert. 

    Das Tool ist leider nicht einfach zu Bedienen, also wenn ihr Fragen habt ...

    Hier ein kleiner Video wie solch ein kleiner Fluss aussehen kann. Da das Ganze nur ein Mesh mit einem Shader drauf ist, ist die Performance Vernachlässigbar. Zudem kann man Flussrichtung, Reflektionen, Farbe des Wassers, Wellenform einstellen.

    Video:
    https://streamable.com/tnw4f


    yPX9ra7.jpg

    1. Zer0Cool

      Zer0Cool

      Ja, das kannte ich auch schon, hab's aber nicht gekauft. Aber mal ehrlich, mal abgesehen vom Sound, den zusätzlichen Partikeleffekten (und dem passenden Flussbett) finde ich nicht, daß es optisch besser aussieht.

      Aber klar, für alle "All-In-One-Lösung" und für jemanden der sich nicht durch den obigen Shader "durchwuseln" möchte ist dieses Asset schon recht genial, zum man damit auch gleich die passenden Meshes erzeugen kann und das Abgleichen des Flussmeshes ans Terrain sieht auch interessant aus.

      Muss man das Flussbett eigentlich noch per Hand ergänzen?
      Dies könnte man nämlich auch automatisch erzeugen, indem man die UVs des Terrainmeshes ausliest, die UVs dem generiertem Mesh zuordnet und dem  River-Material-Shader die Splatmaptexturen des Terrains zuweist.
      Oder er schaltet der Material einfach nur auf transparent und man muss das Flussbett selbst ergänzen?

    2. (See 2 other replies to this status update)

  3. Ich habe heute weiter an meinem Overlayshader gearbeitet und einen kleinen Helfer programmiert, womit man innerhalb der Sceneview direkt auf einen Mesh eine Maske malen kann. Das Ganze ist ein Editorskript welches in eine Textur zeichnet und diese Textur wird dann an meinen Overlayshader übergeben.
    Der Overlayshader stellt die Textur über einen seiner Slots dar. Über dieses Tool soll man dann im Szeneview eine Maskentextur erzeugen können, um Overlays an bestimmten Stellen ein- und auszublenden zu können:

    Video:
    https://streamable.com/9rys8
    https://streamable.com/sb5wf

    Mit dem im Video gezeigten Tool direkt auf den Mesh gemalt:
    E5cG3xb.jpg

    Der Overlayshader selbst kann mehrere Overlaytexturen auf einer Haupttextur abbilden. Dabei kann sowohl die UV0 als auch die UV1 (Lightmap UV) verwendet werden. Das Overlay kann dabei "Linear" oder "Additive" eingeblendet werden, hat ein eigenes Tiling/Offset und eine eigene Normaltextur. Das Prinzip ist ähnlich wie die Detail Albedo des Standardshaders (und seiner Detailmask) nur das man eben mehrere Overlays verwenden kann, die Stärke der Overlays bestimmen kann (Opacity) und den Overlaymode frei wählen kann. Ansonsten entspricht der Overlayshader dem Standardshader (PBS Surfaceshader).
    Zudem habe ich den Overlayshader nun noch um Vertexfarben erweitert. Damit kann man nun anhand der Vertexfarben ebenfalls die Overlays Ein-  und Aus- oder Überblenden

    Overlayshader:
    KyxzakTg.png


    Definition einer Kante anhand von Vertexfarben (= schwarze Streifen) an der die Overlays ausgeblendet werden sollen:gsTWzo9.png

    Ergebnis (ausgeblendetes Overlay im Bereich der Kante):

    JtkkSh3.jpg
     

    Mal ein Beispielbild einer kompletten Wand die mit 2 Overlays "verziert" wurde:
    7lwfBaY.jpg

    Bilder (c) by Kojote ;)

    1. Zer0Cool

      Zer0Cool

      Ich habe den Mask Painter heute weiter verfeinert, hier einmal ein typischer Anwendungsfall. Man hat eine Overlaytextur auf einer Wand und möchte bestimmte Bereiche dieses Overlays ausblenden. Über den Painter wählt man aus, ob man UV0 oder UV1 des Meshes verwenden möchte (und noch andere EInstellungen) und malt drauf los. Der Painter erzeugt beim Malen eine Textur und legt sie zur Visualisierung als Overlay auf den Overlayshader des aktuellen Wand-Materials. Ist man fertig, wird die erzeugte Textur als PNG gespeichert (und der Alpha invertiert). Zum Schluss verwendet man die so erzeugte Textur nun als Maske im Overlayshader (Material) des Meshes.

      VIdeo:
      https://streamable.com/jzhwa

       

  4. So heute einmal mit "Custom-Editoren" beschäftigt, da ich nun doch einzelne "Decorator-Drawer" im Skript herausgeschmissen habe.

    So Sachen wie Logo's und Label-Bereiche und Buttons waren etwas kniffelig. Zudem gibt es verschiedene Layout-Klassen die man in einem Custom-Editor mixen muss, daß hat Unity nicht gut gelöst...

    Hier das aktuelle Ergebnis:
    CjLqAdU.png

    1. Zer0Cool

      Zer0Cool

      Das wäre bestimmt eine Alternative, aber die internen EditorUI-Methoden von Unity selber können mittlerweile auch schon recht viel, man muss nur immer die richtige Methode finden und wissen wie man sie richtig einbaut..., was halt unschön ist, es gibt mittlerweile 4 Klassen womit man UI-Elemente zeichnen kann, es wäre besser Unity hätte alles in eine Klasse zusammengefasst, so ist man immer am Suchen, welches Layoutelement man über welcher Klasse darstellen muss...

      Mittlerweile funktioniert aber alles über eine Art "Autolayout" (wenn man die richtige Klasse verwendet), was das Erstellen der UI sehr erleichtert.

    2. (See 2 other replies to this status update)

  5. So heute einmal mit "Custom-Editoren" beschäftigt, da ich nun doch einzelne "Decorator-Drawer" im Skript herausgeschmissen habe.

    So Sachen wie Logo's und Label-Bereiche und Buttons waren etwas kniffelig. Zudem gibt es verschiedene Layout-Klassen die man in einem Custom-Editor mixen muss, daß hat Unity nicht gut gelöst...

    Hier das aktuelle Ergebnis:
    CjLqAdU.png

    1. Zer0Cool

      Zer0Cool

      Umpf, eine Coroutine zu erzeugen und eine Progressbar für das Editorskript anzuzeigen (nachdem man einen Button drückt) war ja mal eine weitere Herausforderung oO

    2. (See 2 other replies to this status update)

  6. So mal wieder ein Update zu dem Grasrenderer an dem ich immer noch arbeite. Ich habe noch einmal das Wegdrücken des Grases durch den Spieler (in dem Fall ein Ball) überarbeitet. Im Video habe ich das Gras zudem auch einmal mannshoch generiert, damit der Effekt besser wirkt. Weitere Fortschritte im Projekt sind, daß ich nun die Graspositionen des Unityterrains auslesen kann und mit diesen den Grasrenderer "füttern" kann. Es gibt aber immer noch viel zu tun, unter anderem muss ein Paging für das Auslesen der Positionen des Unitygrases eingebaut werden.

    So viel Spaß damit, ich hoffe ich bin nicht zu schnell gerollt ;)
    https://streamable.com/zynfr

    1. Zer0Cool

      Zer0Cool

      Ich habe ja mit Absicht alle Objekte in eine Speicherstruktur gelegt, damit diese als Block an die GPU übergeben werden kann, damit entsteht jeweils nur 1 Drawcall für alle Gras-Instanzen. Jedesmal wenn man Speicherzugriffe macht, Speicher umstrukturiert oder Speicher zusammenlegt verliert man Performance und da dies meist jeweils pro Frame durchgeführt werden müsste, sollte man dies vermeiden solange es geht.
      Wenn ich später wirklich einmal ein Objekt "suchen" muss, dann erledigt das der Compute-Shader. Dieser bekommt sowieso bereits alle Instanzen "in die Hand" und kann solche Filteraktionen extrem performant durchführen. Der Compute-Shader filtert mir aktuell bereits alle Instanzen aus, die nicht im Kamera-Frustum liegen und er filtert Instanzen die Out-of-Range sind.

    2. (See 8 other replies to this status update)

  7. So mal wieder ein Update zu dem Grasrenderer an dem ich immer noch arbeite. Ich habe noch einmal das Wegdrücken des Grases durch den Spieler (in dem Fall ein Ball) überarbeitet. Im Video habe ich das Gras zudem auch einmal mannshoch generiert, damit der Effekt besser wirkt. Weitere Fortschritte im Projekt sind, daß ich nun die Graspositionen des Unityterrains auslesen kann und mit diesen den Grasrenderer "füttern" kann. Es gibt aber immer noch viel zu tun, unter anderem muss ein Paging für das Auslesen der Positionen des Unitygrases eingebaut werden.

    So viel Spaß damit, ich hoffe ich bin nicht zu schnell gerollt ;)
    https://streamable.com/zynfr

    1. Zer0Cool

      Zer0Cool

      Ist noch nicht "eingebaut", wäre aber ein nettes weiteres Feature, ich habe sowieso alle Positionen aller Grasdetails permanent im Speicher, daher lassen sich solche Features recht schnell umsetzen. Das Hauptproblem bei so etwas ist immer ein effizienter Speicherzugriff, damit bei einem Entfernen von Gras nicht die Performance droppt...

      Das System "kann" sehr interaktiv sein und trotzdem performant, dies liegt an der verwendeten Technik. Es werden sowieso alle Grasdetails in jedem Frame über ein Speicherarray neu gezeichnet. Manipuliert man dieses Array kann man Instanzen hinzufügen oder entfernen. Man sollte dies eben nur nicht unbedingt jedes Frame tun, da eben auch ein Speicherzugriff Performance kostet.

      Aktuell habe ich eingebaut, daß das Gras bereits auf den Spieler reagiert, dies macht der Shader und kostet daher "fast" keine Performance.
      Bin gerade dabei ein kleines Video zu machen mit einer kleinen UI, welches alle Settings vorstellt, werde ich heute oder morgen mal Hochladen.

      Ich kann dir später gern das System als Betatest zur Verfügung stellen, wenn es dann halbwegs fertig ist, dann habe ich auch gleich einen guten Test des Systems.

    2. (See 8 other replies to this status update)

  8. So mal wieder ein Update zu dem Grasrenderer an dem ich immer noch arbeite. Ich habe noch einmal das Wegdrücken des Grases durch den Spieler (in dem Fall ein Ball) überarbeitet. Im Video habe ich das Gras zudem auch einmal mannshoch generiert, damit der Effekt besser wirkt. Weitere Fortschritte im Projekt sind, daß ich nun die Graspositionen des Unityterrains auslesen kann und mit diesen den Grasrenderer "füttern" kann. Es gibt aber immer noch viel zu tun, unter anderem muss ein Paging für das Auslesen der Positionen des Unitygrases eingebaut werden.

    So viel Spaß damit, ich hoffe ich bin nicht zu schnell gerollt ;)
    https://streamable.com/zynfr

    1. Zer0Cool

      Zer0Cool

      Die Performanceausagen sind sehr schwer zu machen, aber laut meinen eigenen Messungen ist die Performance vergleichbar zu einem "optimal" eingestellten Unity-Terraingras (je nach Unitygras-Chunkgröße), aber eben auch je nachdem welche Qualitätsstufen man später bei meinem Shader einstellt.

      Der Basic-Gras-Shader ist in etwa gleich "schnell" (oder schneller, da mein Basicgras aktuell keinen Tiefenpass benötigt) wie der Unitygras-Shader. Das System wird später ja eine Mischung aus einem Advanced-Gras-Shader und Basic-Gras-Shader verwenden. Der Advanced-Shader ist etwa 3-4 mal langsamer als Unitygras, da er Schatten- und Tiefendetails berechnen muss. Unitygras wirft ja keine Schatten, sondern kann nur Schatten empfangen.

      Das System wird im Endeffekt später dafür ausgelegt den Advanced-Shader im Nahbereich bis zu 50 Meter und einen Basic-Shader für den Fernbereich 50-250 Meter zu verwenden. Man könnte zwar den Basic-Shader auch theoretisch für einen größeren Range verwenden, aber davon würde ich abraten, man macht sich dadurch nur unnötig die Performance kaputt. Ein Unityterrain mit > 250 Meter Grasrange wird ja von Unity auch nicht unterstützt, eben aus diesem Grund.

    2. (See 8 other replies to this status update)

  9. Weiß jemand, ob irgendwo der Source Code vom CharacterController online ist? Habe im Forum den vom FirstPersonController gefunden, da dachte ich vielleicht schwirrt auch irgendwo der vom CC rum konnte aber nichts finden.

    1. Zer0Cool

      Zer0Cool

      Ich glaube auch, daß es totaler Spaghetticode ist und wenn sie da die Ausrichtung des Colliders ändern nix mehr funktioniert xD

    2. (See 9 other replies to this status update)

  10. Weiß jemand, ob irgendwo der Source Code vom CharacterController online ist? Habe im Forum den vom FirstPersonController gefunden, da dachte ich vielleicht schwirrt auch irgendwo der vom CC rum konnte aber nichts finden.

    1. Zer0Cool

      Zer0Cool

      Ja, ich denke eine Art an die "Leine gelegten" RB. Funktionen die für den CC benötigt werden sind aktiv, andere Funktionen werden unterdrückt oder sind ausgeschaltet... und da Unity innerhalb seiner C++-Klassen noch mehr Möglichkeiten hat den RB intern zu verändern oder anders zu verwenden kann man nur Spekulieren was die da intern gemacht haben...

    2. (See 9 other replies to this status update)

  11. Weiß jemand, ob irgendwo der Source Code vom CharacterController online ist? Habe im Forum den vom FirstPersonController gefunden, da dachte ich vielleicht schwirrt auch irgendwo der vom CC rum konnte aber nichts finden.

    1. Zer0Cool

      Zer0Cool

      Laut meinen Experimenten hat der CC hat auch eine Art internen RB. Der RB sorgt ja dafür, daß der CC keine anderen Objekte durchdringen kann...
       

    2. (See 9 other replies to this status update)

  12. Weiß jemand, ob irgendwo der Source Code vom CharacterController online ist? Habe im Forum den vom FirstPersonController gefunden, da dachte ich vielleicht schwirrt auch irgendwo der vom CC rum konnte aber nichts finden.

    1. Zer0Cool

      Zer0Cool

      Für einen "gekippten" Controller wird man dann wohl nicht um einen RB-Controller herumkommen. Hab mich auch schon gefragt, welchen Controller man am besten für Tiere etc verwendet.

    2. (See 9 other replies to this status update)

  13. So mal wieder ein Update zu dem Grasrenderer an dem ich immer noch arbeite. Ich habe noch einmal das Wegdrücken des Grases durch den Spieler (in dem Fall ein Ball) überarbeitet. Im Video habe ich das Gras zudem auch einmal mannshoch generiert, damit der Effekt besser wirkt. Weitere Fortschritte im Projekt sind, daß ich nun die Graspositionen des Unityterrains auslesen kann und mit diesen den Grasrenderer "füttern" kann. Es gibt aber immer noch viel zu tun, unter anderem muss ein Paging für das Auslesen der Positionen des Unitygrases eingebaut werden.

    So viel Spaß damit, ich hoffe ich bin nicht zu schnell gerollt ;)
    https://streamable.com/zynfr

    1. Zer0Cool

      Zer0Cool

      Hier 2 Beispielbilder wie diese Technik sich entfaltet bei einer tief stehenden Sonne und 2 verschiedenen Einstellungen:

      Distance zwischen Grasposition (Z) und Depth-Textur 10:
      unknown.png

      Distance zwischen Grasposition (Z) und Depth-Textur 2.2:
      unknown.png

    2. (See 8 other replies to this status update)

  14. So mal wieder ein Update zu dem Grasrenderer an dem ich immer noch arbeite. Ich habe noch einmal das Wegdrücken des Grases durch den Spieler (in dem Fall ein Ball) überarbeitet. Im Video habe ich das Gras zudem auch einmal mannshoch generiert, damit der Effekt besser wirkt. Weitere Fortschritte im Projekt sind, daß ich nun die Graspositionen des Unityterrains auslesen kann und mit diesen den Grasrenderer "füttern" kann. Es gibt aber immer noch viel zu tun, unter anderem muss ein Paging für das Auslesen der Positionen des Unitygrases eingebaut werden.

    So viel Spaß damit, ich hoffe ich bin nicht zu schnell gerollt ;)
    https://streamable.com/zynfr

    1. Zer0Cool

      Zer0Cool

      Danke ;)

      Ich bin gerade dabei den Grashader in eine Advanced-Shader-Version und eine Basic-Shader Version aufzuteilen. Je nach LOD werden später beide Shader in der fertigen Lösung eingesetzt. Der Advanced-Gras-Shader für den Nahbereich (volle Schatten / Surfaceshader / Translucent / Normalmap etc.) und einen Basic-Gras-Shader für den Fernbereich.

      Der Basic-Shader ist dabei komplett auf Performance getrimmt. Es ist kein Surface-Shader, er wirft keine Schatten und es wird nur eine Textur verwendet. Die Herausforderung war nun trotzdem ein ansehnliches Renderergebnis zu erzeugen. Wie man im unteren Video auch sehen kann, habe ich bereits Schatten zwischen dem Basic Gras simuliert, indem ich einfach das Gras von unten nach oben dunkel eingefärbt habe, die Stengel des Grases sind eher dunkel, da sie in einem Grasfeld kein Licht abbekommen, die oberen Bereiche des Grases sind hell, da sie das meiste Licht empfangen.

      Die größte Herausforderung war nun es dem Shader zu ermöglichen Schatten zu empfangen ohne einen zusätzlichen Depth-Pass, dieser würde die Performance nahezu halbieren (hierbei würden alle Grasdetails in die Depthtextur gerendert werden)

      Der Shader verwendet nun die Schatten-Screenspace-Textur der Szene und kombiniert diese mit der Depth-Textur der Szene. Beide werden von Unity "gratis" erzeugt und belasten damit nicht die Performance des Shaders. Das Knifflige war nun beide Texturen zu kombinieren, um zu entscheiden, ob ein Schatten auf das Basic-Gras geworfen werden darf oder nicht. Über einen Regler kann man diesen Abgleich steuern. Das Basic-Gras besitzt quasi innerhalb von Unity keine Tiefeninformation und daher kann der Schattenempfang nicht auf herkömmliche Weise implementiert werden.

      Einfach ausgedrückt, Schatten wird nun dort eingeblendet, wo die Tiefeninformation der Scene zur Position des Grases "passt".

      Hier das Ergebnis / Basic Gras Shader:
      https://streamable.com/dwkib

      Hier ist ein Bild vom Terrain, falls ihr euch wundert, wo der seltsame Schatten herkommt, er wird von dem kleinen Hügel des Terrains geworfen:
      unknown.png

    2. (See 8 other replies to this status update)

    1. Zer0Cool

      Zer0Cool

      Haben die die Probuilder Adv Version nun kostenlos gemacht? Puh gut das ich es nicht gekauft hatte :blink:, das waren 90 Euro oder so.

    2. (See 2 other replies to this status update)

  15. Bin aktuell immer noch dabei einen Grashader zu schreiben.
    Im Zuge dessen bin ich nun so ziemlich alle Lösungen durchgegangen, wie man Grasdetails performant rendern kann:

    • einzelner Mesh (Performance miserablel)
    • kombinierter statischer Mesh (Performance überraschend schlecht) 
    • instanced Mesh (Performance geht so, aber man kann nur 1024 Meshes in einem Zug rendern)
    • instanced indirect Mesh (Performance bislang die Beste / derzeit verfolgte Lösung)
    • Geometry Shader Mesh (Performance leicht schlechter als instanced indirect)

    Zusätzlich zum Grasshader (instanced indirect) wird ein Compute-Shader verwendet, der berechnet, wo die Positionen die Grasdetails sind und "blendet" diese entsprechend aus, wenn sie nicht im Frustum der Kamera liegen. Der Render-Shader bekommt dann nur die Instanzen die der Compute-Shader ausgibt. Dabei hatte der Compute-Shader mir eine Menge Probleme bereitet.... Zum einen kann er nur exakt vordefinierte Happen verarbeiten, zum anderen verhaut man sich die gute Performance, wenn man bestimmte Dinge macht und nicht höllisch aufpasst (wie das Auslesen der zurückgegebenen Werte eines Buffers). Vermutlich wird hier C#-Code anders compiliert, wenn man bestimmte Zugriffe tätigt.

    Hier nun das Ergebnis. Man sieht wie die Grasdetails im Bereich außerhalb des Kamera-Frustum ausgeblendet werden:
    Video: https://streamable.com/lki7f

    1YlryRA.jpg

    S7nxRDQ.png

    unknown.png


     

    1. Zer0Cool

      Zer0Cool

      Die Daten "müssen" jedes Frame an die GPU gesendet werden (systembedingt). Daher sollten die Daten an die GPU gesendet werden, die "vor" dem Spieler liegen. Daten die seitlich des Kamera Frustum liegen werden durch meinen Computershader "herausgenommen".
      Ich habe vor die Daten fürs Terrain in einem Speicherblock zu halten und dieses Fenster aus diesem Block pro Frame herauszukopieren (wenn sich die Kamera bewegt hat). Ich hoffe dies ist die beste Lösung. Kommt aber darauf an, wie schnell ein kleinerer Array-Speicherblock aus einem großen Array "herausgeschnitten" werden kann...

      Ich kann nur jedem empfehlen ein FPS-Counter in sein Spiel einzubauen, hier ein FPS Counter mit minimalstem Performanceimpact, welcher die aktuelle FPS anzeigt die auch tatsächlich erreicht wird. Von mir auf's Notwendigste reduziert ;)
       

      using UnityEngine;
      using System.Collections;
      
      public class FPSDisplay : MonoBehaviour
      {
      
          int framesAccumulated;
          int framesFinal;
          float oneSecondTimer;
          public Vector4 RectData = new Vector4(0, 0, 66, 26);
      
          void Update()
          {
              framesAccumulated += 1;
              if (Time.time > oneSecondTimer + 1)
              {
                  framesFinal = framesAccumulated;
                  oneSecondTimer = Time.time;
                  framesAccumulated = 0;
              }
          }
      
          void OnGUI()
          {
              if (framesFinal > 60) GUI.contentColor = Color.green;
              else GUI.contentColor = Color.red;
              GUI.Box(new Rect(RectData.x, RectData.y, RectData.z, RectData.w), framesFinal.ToString() + " fps");
          }
      }

       

    2. (See 9 other replies to this status update)

  16. Bin aktuell immer noch dabei einen Grashader zu schreiben.
    Im Zuge dessen bin ich nun so ziemlich alle Lösungen durchgegangen, wie man Grasdetails performant rendern kann:

    • einzelner Mesh (Performance miserablel)
    • kombinierter statischer Mesh (Performance überraschend schlecht) 
    • instanced Mesh (Performance geht so, aber man kann nur 1024 Meshes in einem Zug rendern)
    • instanced indirect Mesh (Performance bislang die Beste / derzeit verfolgte Lösung)
    • Geometry Shader Mesh (Performance leicht schlechter als instanced indirect)

    Zusätzlich zum Grasshader (instanced indirect) wird ein Compute-Shader verwendet, der berechnet, wo die Positionen die Grasdetails sind und "blendet" diese entsprechend aus, wenn sie nicht im Frustum der Kamera liegen. Der Render-Shader bekommt dann nur die Instanzen die der Compute-Shader ausgibt. Dabei hatte der Compute-Shader mir eine Menge Probleme bereitet.... Zum einen kann er nur exakt vordefinierte Happen verarbeiten, zum anderen verhaut man sich die gute Performance, wenn man bestimmte Dinge macht und nicht höllisch aufpasst (wie das Auslesen der zurückgegebenen Werte eines Buffers). Vermutlich wird hier C#-Code anders compiliert, wenn man bestimmte Zugriffe tätigt.

    Hier nun das Ergebnis. Man sieht wie die Grasdetails im Bereich außerhalb des Kamera-Frustum ausgeblendet werden:
    Video: https://streamable.com/lki7f

    1YlryRA.jpg

    S7nxRDQ.png

    unknown.png


     

    1. Zer0Cool

      Zer0Cool

      Spielt aber als Performanceaspekt nur indirekt eine Rolle, da die komplette Arbeit auf die GPU verlagert wurde. Der Drawcall sagt in dem Sinne nur, daß ich nur 1x Daten an die GPU schicke und die GPU dann die Instanzen selbst erzeugt (Merkmal von einem instanced indirect shader). Man bekommt ja auch keine Drawcall oder Tri's Anzeige mehr im, Stats-Window von Unity, da das ganze System komplett an Unity vorbei arbeitet.

      PS: 
      Die FPS-Anzeige im Unity Stats-Window ist komplett nutzlos ... Sie zeigt überhaupt nicht mehr die "echten" FPS im Spiel an.

    2. (See 9 other replies to this status update)

  17. Bin aktuell immer noch dabei einen Grashader zu schreiben.
    Im Zuge dessen bin ich nun so ziemlich alle Lösungen durchgegangen, wie man Grasdetails performant rendern kann:

    • einzelner Mesh (Performance miserablel)
    • kombinierter statischer Mesh (Performance überraschend schlecht) 
    • instanced Mesh (Performance geht so, aber man kann nur 1024 Meshes in einem Zug rendern)
    • instanced indirect Mesh (Performance bislang die Beste / derzeit verfolgte Lösung)
    • Geometry Shader Mesh (Performance leicht schlechter als instanced indirect)

    Zusätzlich zum Grasshader (instanced indirect) wird ein Compute-Shader verwendet, der berechnet, wo die Positionen die Grasdetails sind und "blendet" diese entsprechend aus, wenn sie nicht im Frustum der Kamera liegen. Der Render-Shader bekommt dann nur die Instanzen die der Compute-Shader ausgibt. Dabei hatte der Compute-Shader mir eine Menge Probleme bereitet.... Zum einen kann er nur exakt vordefinierte Happen verarbeiten, zum anderen verhaut man sich die gute Performance, wenn man bestimmte Dinge macht und nicht höllisch aufpasst (wie das Auslesen der zurückgegebenen Werte eines Buffers). Vermutlich wird hier C#-Code anders compiliert, wenn man bestimmte Zugriffe tätigt.

    Hier nun das Ergebnis. Man sieht wie die Grasdetails im Bereich außerhalb des Kamera-Frustum ausgeblendet werden:
    Video: https://streamable.com/lki7f

    1YlryRA.jpg

    S7nxRDQ.png

    unknown.png


     

    1. Zer0Cool

      Zer0Cool

      Mhh bin halt auch noch am Überlegen, ich brauche jeweils einen recheckigen Bereich vor dem Spieler und dieser muss mit Daten befüllt werden. Wenn die Kamera sich bewegt verschiebt sich dieses Rechteck. Bin mir nicht sicher, ob ich einen fließenden Übergang hin bekomme, wenn es mehrere Quadranten gibt... Aber mehrere Quadranten wäre auch schon eine Überlegung wert, das erhöht halt die Drawcalls. Aktuell brauche ich nur 1 Drawcall für eine Grassorte.

    2. (See 9 other replies to this status update)

  18. Bin aktuell immer noch dabei einen Grashader zu schreiben.
    Im Zuge dessen bin ich nun so ziemlich alle Lösungen durchgegangen, wie man Grasdetails performant rendern kann:

    • einzelner Mesh (Performance miserablel)
    • kombinierter statischer Mesh (Performance überraschend schlecht) 
    • instanced Mesh (Performance geht so, aber man kann nur 1024 Meshes in einem Zug rendern)
    • instanced indirect Mesh (Performance bislang die Beste / derzeit verfolgte Lösung)
    • Geometry Shader Mesh (Performance leicht schlechter als instanced indirect)

    Zusätzlich zum Grasshader (instanced indirect) wird ein Compute-Shader verwendet, der berechnet, wo die Positionen die Grasdetails sind und "blendet" diese entsprechend aus, wenn sie nicht im Frustum der Kamera liegen. Der Render-Shader bekommt dann nur die Instanzen die der Compute-Shader ausgibt. Dabei hatte der Compute-Shader mir eine Menge Probleme bereitet.... Zum einen kann er nur exakt vordefinierte Happen verarbeiten, zum anderen verhaut man sich die gute Performance, wenn man bestimmte Dinge macht und nicht höllisch aufpasst (wie das Auslesen der zurückgegebenen Werte eines Buffers). Vermutlich wird hier C#-Code anders compiliert, wenn man bestimmte Zugriffe tätigt.

    Hier nun das Ergebnis. Man sieht wie die Grasdetails im Bereich außerhalb des Kamera-Frustum ausgeblendet werden:
    Video: https://streamable.com/lki7f

    1YlryRA.jpg

    S7nxRDQ.png

    unknown.png


     

    1. Zer0Cool

      Zer0Cool

      Das Unityterrain gibt 2dim Array aus [y,x]. Aber spielt keine Rolle beim Programmstart kann ich die Datenarrays in beliebige Formate umwandeln.

      In dem Fall wo ich die Daten des Terrain auslesen, habe ich ein riesiges 2dim Array:
      [y,x] 2000x2000 

      Hier muss möglichst schnell in rechteckiger Bereich selektiert werden (Bereich um den Spieler heraum auf dem Terrain). Vielleicht gibt es irgendwie eine Methode ein Array aus einem Speicherpointer zu erzeugen ... Kopieren und Hin- und Herschaufeln von Daten gilt es zu vermeiden.

      Vielleicht komm ich hiermit ans Ziel:
      https://msdn.microsoft.com/de-de/library/system.buffer.blockcopy(v=vs.110).aspx

    2. (See 9 other replies to this status update)

  19. Bin aktuell immer noch dabei einen Grashader zu schreiben.
    Im Zuge dessen bin ich nun so ziemlich alle Lösungen durchgegangen, wie man Grasdetails performant rendern kann:

    • einzelner Mesh (Performance miserablel)
    • kombinierter statischer Mesh (Performance überraschend schlecht) 
    • instanced Mesh (Performance geht so, aber man kann nur 1024 Meshes in einem Zug rendern)
    • instanced indirect Mesh (Performance bislang die Beste / derzeit verfolgte Lösung)
    • Geometry Shader Mesh (Performance leicht schlechter als instanced indirect)

    Zusätzlich zum Grasshader (instanced indirect) wird ein Compute-Shader verwendet, der berechnet, wo die Positionen die Grasdetails sind und "blendet" diese entsprechend aus, wenn sie nicht im Frustum der Kamera liegen. Der Render-Shader bekommt dann nur die Instanzen die der Compute-Shader ausgibt. Dabei hatte der Compute-Shader mir eine Menge Probleme bereitet.... Zum einen kann er nur exakt vordefinierte Happen verarbeiten, zum anderen verhaut man sich die gute Performance, wenn man bestimmte Dinge macht und nicht höllisch aufpasst (wie das Auslesen der zurückgegebenen Werte eines Buffers). Vermutlich wird hier C#-Code anders compiliert, wenn man bestimmte Zugriffe tätigt.

    Hier nun das Ergebnis. Man sieht wie die Grasdetails im Bereich außerhalb des Kamera-Frustum ausgeblendet werden:
    Video: https://streamable.com/lki7f

    1YlryRA.jpg

    S7nxRDQ.png

    unknown.png


     

    1. Zer0Cool

      Zer0Cool

      Danke ;) ... der nächste Schritt ist nun die Daten für das Gras aus bestimmten Quellen zu ziehen (z.b. dem Unityterrain) und die Buffer für den Shader damit zu aktualisieren, ohne das die Performance davon zu stark beeinflusst wird.

      Kennt jemand eine Methode wie man Array's möglichst schnell umkopieren kann? Ich glaube da stehen die nächsten Performancetest's ins Haus.

    2. (See 9 other replies to this status update)

  20. Weiß jemand warum Tree Billboards im dunklen leuchten ?

    Hier ein Beispiel:

    unbenannt0ajbk.png

    1. Zer0Cool

      Zer0Cool

      Hab mir eben noch einmal oben dein Bild angeschaut und festgestellt, deine Lichtquelle (DL) ist scheinbar nicht ausgestellt sondern nur verdreht: Stimmt das so?

      Ich habe die Erfahrung machen müssen, wenn die DL nur verdreht ist (um Tag und Nacht zu simulieren), erzeugen noch einige Shader eine "Resthelligkeit" auf der Oberfläche. Dies kommt von der Normalen der Oberfläche und den Sonnenstand, also der Rotation der Sonne (DL). Auch denn die Sonne unter das Terrain Licht wirft, bekommen Oberflächen mit bestimmten Shader noch "Restlicht" ab. Ich könnte mir vorstellen, dies passiert auch mit dem Billboardshader (zumindest hatte ich mal dieses Problem, als ich an einem eigenen Billboardshader gearbeitet hatte). Man kann dieses Problem zwar über eine Verschiebung der Normalen in den Griff bekommen (auch über eine Normalmap) aber beim Billboardshader des Terrain hat man darauf keinen Zugriff.
      Man muss hier also die Farbe der Lichtquelle (DL) wenn es Nachts wird auf schwarz drehen. Zudem sollte man das AL (ambient light) senken und auch die Reflektionen ggf "ausschalten" (diese werden über Lightmaps auf die Texturen gebracht, sogar wenn des DL schwarz ist.

    2. (See 7 other replies to this status update)

  21. Testlauf mit einem Grasshader der nun endlich ohne Windzone und ohne Unityterrain funktioniert. Ich habe diesen Shader aus Teilen des Unity "Tree Creator Leaves" Shader und dem "Grass Billboard" Shader zusammengesetzt. Normal sollte er daher auch ein Translucent Shader sein, aber schwer zu sagen, ob ein wahrnehmbarer Effekt erreicht wird. 
    Ich möchte diesen Shader nun weiter umarbeiten, damit er instanziiert werden kann und ich ihn dann massenhaft auf einem Mesh einsetzen kann.
    Das Mühsame dabei war, daß nirgend irgendwelche Informationen zu den Parameters dieser Shader zu bekommen sind. Zudem musste ich den Shader umschreiben, damit er ohne Vertexfarben klarkommt.

    Video: https://streamable.com/ulptf

    jEtyJ8v.jpg

    1. Zer0Cool

      Zer0Cool

      Hab mir gerade mal das 1. Video angeschaut, war interessant wie er die Matrix für DrawMeshInstanced erstellt und daß er auch einen Mesh für sein Gras verwenden möchte, also keine Billboard, sondern 2 Typen mit Inner- oder Outersections. Die Variante mit den Innersections kannte ich schon (allerdings nur mit 2 Quads) die Outersections ist neu für mich, man lernt nie aus. Ich denke dies kann man auch gut für Bäume in der Ferne verwenden. Die Grasmeshes die ich aus einem Asset habe und verwenden möchte benutzen eher so eine Art "verschobene Outersections" ;)

      Beim 2.  Video bekommt man auch gleich einen Pointcloud-Renderer nicht schlecht... Um Minute 20 ist es aber echt böses Shaderhacking ^^
      Nach dem 2. Video: Das ein Geometry-Shader nicht mit einem Surfaceshader zusammen arbeiten soll, da bin ich noch nicht überzeugt von .. Muss mir noch das 3. Video anschauen.

    2. (See 2 other replies to this status update)

  22. Testlauf mit einem Grasshader der nun endlich ohne Windzone und ohne Unityterrain funktioniert. Ich habe diesen Shader aus Teilen des Unity "Tree Creator Leaves" Shader und dem "Grass Billboard" Shader zusammengesetzt. Normal sollte er daher auch ein Translucent Shader sein, aber schwer zu sagen, ob ein wahrnehmbarer Effekt erreicht wird. 
    Ich möchte diesen Shader nun weiter umarbeiten, damit er instanziiert werden kann und ich ihn dann massenhaft auf einem Mesh einsetzen kann.
    Das Mühsame dabei war, daß nirgend irgendwelche Informationen zu den Parameters dieser Shader zu bekommen sind. Zudem musste ich den Shader umschreiben, damit er ohne Vertexfarben klarkommt.

    Video: https://streamable.com/ulptf

    jEtyJ8v.jpg

    1. Zer0Cool

      Zer0Cool

      Ist denke das ist auch eine sehr gute Lösung. vor allem für Billboardgras.Unity hat es in ihrem Adam-Demo mit ihrem Gras auch so gemacht (habs mir letztens mal im Detail angeschaut, leider fehlen meiner Meinung nach sämtliche Hilfstools fürs Erstellen des Terrains, so daß sie uns nur das fertige Terrain und die Shader gegeben haben)...
      Ich möchte aber verschiedene Grasmeshes verwenden, diese bestehen zum Teil aus mehreren Faces und Texturen daher haben ich vor diesen Shader nun in einen instanzed Shader umzuwandeln und das Erzeugen des Meshes in die GPU zu verlagern. Ich habe vor die Positionen des Unityterrains einfach zu übernehmen, später könnte man aber das Gras auch einfach über einen "Meshpainter" auf unterschiedliche Oberflächen auftragen. Für die Positionen muss man die Detail Prototyp-Positionen aus dem Terrain auslesen. Dies hat auch gleich den Vorteil, daß ich die Instanzfarbe und die Instanzgröße und die Instanzworldposition an den Shader (wird in meinem Shader anstellen von Vertexfarben verwendet) übertragen kann.
       

    2. (See 2 other replies to this status update)

  23. Experimente mit emissiven Materialien. Eine einfache Sphere mit Material:

    https://streamable.com/qo0ub

    dZy5YeS.png

    1. Zer0Cool

      Zer0Cool

      Version 2 mit der Übertragung des Lichtes auf die Umgebung:
      https://streamable.com/cvtix

  24. Seit dem @Zer0Cool hier im Forum herumgeistert kommt man nie dazu Themen zu beantworten, weil er immer schneller ist :D

×