MustafGames Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 Gruß, ich bin auf folgenden Shader mal irgendwann gestürzt, weiß aber nicht mehr wo: Shader "Basic" { Properties { _Color("Main Color", Color) = (1,1,1,1) _MainTex("Base (RGBA)", 2D) = "white" {} } SubShader { Lighting Off Color[_Color] Pass { SetTexture[_MainTex]{ Combine texture * primary } } } } Frage ist, warum funktioniert dieser obwohl er so kurz gehalten ist, ist das optimal für Mobile & PC Geräte? Ich suche einen Shader welcher nur die folgenden Dinge kann: Verwendbar für: CanvasRenderer (UI Image & UI Text) SpriteRenderer ParticleRenderer TilemapRenderer Welche Funktionen soll er haben? UI-Text soll auch farbig sein Keine Schatten Keine Lichtberechnungnen Kein Fog Mobile Shader GPU Instancing eventuell Alpha Blending statt Transparent / Transparent Cutout Double Sided Global Illumination soll ganz weg aus dem Material Kann mir jemand dazu etwas beibringen? Mit freundlichen Grüßen Franz Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 Warum willst du dafür einen einzelnen Shader haben? Das ist keine gute Idee und funktioniert auch gar nicht. Deine Anwendungsgebiete haben ganz unterschiedliche Anforderungen an einen Shader. Du hast doch einen ganzen Satz vorgegebener Shader zur Verfügung, benutz die doch einfach? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 28. Juni 2020 Autor Melden Share Geschrieben 28. Juni 2020 vor 3 Minuten schrieb Sascha: Warum willst du dafür einen einzelnen Shader haben? Das ist keine gute Idee und funktioniert auch gar nicht. Deine Anwendungsgebiete haben ganz unterschiedliche Anforderungen an einen Shader. Du hast doch einen ganzen Satz vorgegebener Shader zur Verfügung, benutz die doch einfach? Danke für die Antwort. Warum ist es nicht sinnvoll nur einen Shader für diese ganzen 2D Sachen zu nehmen? Ich möchte es möglichst einfach halten. Weniger Shader heißt ja auch das beim exportieren alles schneller geht, und das Spiel am Ende weniger Speicher verbraucht oder? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 vor 19 Minuten schrieb MustafGames: Warum ist es nicht sinnvoll nur einen Shader für diese ganzen 2D Sachen zu nehmen? Wie gesagt - weil deine Anwengungsgebiete völlig unterschiedliche Anforderungen haben. Du willst ja auch nicht ein Haus bauen und sagst "ich will das aber einfach halten, ich beschränke mich auf einen einzelnen Hammer". vor 22 Minuten schrieb MustafGames: Weniger Shader heißt ja auch das beim exportieren alles schneller geht Wenn ich das richtig gesehen habe, kriegt Unity seit 2019.4 das mit dem Shader Build Caching vernünftig hin. Die Default-Shader werden so oder so mitkompiliert, durch hinzufügen eines neuen Shaders sparst du also keine Zeit vor 23 Minuten schrieb MustafGames: und das Spiel am Ende weniger Speicher verbraucht oder? Wir reden hier von Shadern. Das sind ziemlich kleine Dateien, wenige kilobyte. Jede einzelne Textur die mehr Pixel hat als man an der Hand abzählen kann, jede Sounddatei nimmt ein Vielfaches davon ein. Also mach dir mal wegen Shadern keinen Kopf. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 28. Juni 2020 Autor Melden Share Geschrieben 28. Juni 2020 Okay, ja verstehe was du meinst, hab bis deine Antwort kam bisschen nachgelesen und möchte trotzdem diesen Shader mal schreiben um einfach dazu zu lernen. Es ist also ein "Fixed-Function-Shader", soweit ich weiß. Ich habe mal versucht diesen auf eine Minimum zu halten, also kein Licht, keine Schatten, kein Nebel, SpriteAtlas nutze etc. 1. Fällt dir irgendwo ein Fehler auf was nicht richtig so ist? 2. Combine texture * primary ist ja das was die Fixed-Function ausmacht (geeignet für alte Hardware Modelle, was ich ja will). Gibt es irgendwo eine Liste was statt * primary sonst so hingeschrieben werden könnte? 3. ist es bei Fixed-Function Shadern sinnvoll GPU Instancing zu nutzen oder geht das gar nicht? Shader "Basic" { Properties { [NoScaleOffset] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Tint", Color) = (1,1,1,1) } SubShader { Tags { "Queue" = "Geometry" "IgnoreProjector" = "True" "RenderType" = "Opaque" "PreviewType" = "Plane" "CanUseSpriteAtlas" = "True" "ForceNoShadowCasting" = "True" } Cull Off //Kein Licht Lighting Off SeparateSpecular Off ZWrite Off //ZTest[unity_GUIZTestMode] //Transparenz Blend SrcAlpha OneMinusSrcAlpha Pass { SetTexture[_MainTex] { //Combine texture * primary DOUBLE Combine texture * primary } } } } Bisher macht dieser Shader für einen SpriteRenderer alles was ich brauche. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 vor 2 Minuten schrieb MustafGames: möchte trotzdem diesen Shader mal schreiben um einfach dazu zu lernen. DAS ist ein sehr guter Grund vor 2 Minuten schrieb MustafGames: 1. Fällt dir irgendwo ein Fehler auf was nicht richtig so ist? Nein, aber das liegt eventuell auch daran, dass ich keine ShaderLab-Syntax im Pass benutze. Wenn ich einen Shader schreibe, dann nutze ich die Standardpackung ShaderLab für außenrum (Properties definieren und so) und im Pass kommt dann ein CGINCLUDE-Block, wo ich CG-Code schreibe. Diese ShaderLab-Syntax... SetTexture[_MainTex] { //Combine texture * primary DOUBLE Combine texture * primary } ...ist halt irgendwann mal von irgendwem bei Unity entwickelt worden und seitdem komplett vernachlässigt. Ist auch wesentlich weniger mächtig als standardisierter Shader-Code. Dieser ist initial schwerer zu lernen, schreibt sich dann aber wenigstens ungefähr wie C-Code, und es gibt einen Haufen Resourcen, weil das halt überall vorkommt und nicht nur in veralteten Unity-Shadern. vor 7 Minuten schrieb MustafGames: Gibt es irgendwo eine Liste was statt * primary sonst so hingeschrieben werden könnte? Jau, hier und in den folgenden/untergeordneten Seiten. vor 8 Minuten schrieb MustafGames: ist es bei Fixed-Function Shadern sinnvoll GPU Instancing zu nutzen oder geht das gar nicht? Da bin ich ehrlich gesagt überfragt. Ich verstehe die Funktionsweise und Syntax von Fragment- und Vertex-Shadern, aber mit so fancy Zeug wie Instancing in Shadern habe ich mich nie beschäftigt. Der Builtin-SpriteRenderer-Shader ist auch nicht sonderlich komplex. Der hat hauptsächlich noch ein paar Konditionale für den Compiler, um in verschiedenen Situationen leicht unterschiedlich funktionieren zu können. Ich kann nur empfehlen, dir den Source Code von den Builtin-Shadern runterzuladen und anzuschauen. Die Downloads gibt's hier. Einfach im Dropdown "Buit in Shaders" auswählen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 28. Juni 2020 Autor Melden Share Geschrieben 28. Juni 2020 Danke dir, da gibt es einiges zu lernen. Mir ist gerade aufgefallen, das wenn ich meinen Shader von oben nehme für einen SpriteRenderer, dann kann ich im SpriteRenderer irgend eine Farbe bei Color einstellen aber es ändert sich nichts, weißt du wie man das lösen kann? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 Hallo Ich muss mal so blöd fragen... Ist es normal, dass man selbst mit halbwegs guten c# Kenntnissen bei shadern nur Bahnhof versteht. Das sieht total abgefahren aus. Wird bestimmt eine heftige lernkurve sein. Wirkt wie Voodoo... Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 vor 45 Minuten schrieb MustafGames: Mir ist gerade aufgefallen, das wenn ich meinen Shader von oben nehme für einen SpriteRenderer, dann kann ich im SpriteRenderer irgend eine Farbe bei Color einstellen aber es ändert sich nichts, weißt du wie man das lösen kann? Ja: Schau dir den Buitin-Sprite-Shader an [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1) Die Komponente scheint exakt diese Eigenschaft ansprechen zu wollen. vor 24 Minuten schrieb chrische5: Ich muss mal so blöd fragen... Ist es normal, dass man selbst mit halbwegs guten c# Kenntnissen bei shadern nur Bahnhof versteht. Das sieht total abgefahren aus. Wird bestimmt eine heftige lernkurve sein. Wirkt wie Voodoo... Ja, ist normal. Shader-Code kommt aus einer anderen Welt mit ganz anderen Ideen. Da hier anfangs keine Abläufe programmiert wurden, sondern nur das Aussehen von Oberflächen, ist die Syntax anders. Inzwischen werden Grafikkarten für alle möglichen Sub-Programme benutzt, aber die Ursprünge sind noch deutlich sichtbar. Und ja, die Lernkurve ist heftig. Deswegen ist es gut, dass Leute visuelle Shader-Editoren entwickeln. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
chrische5 Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 Hallo Visuelle shader Editoren... Das muss ich mir mal anschauen. Ist das dann unity spezifisch? Christoph Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 28. Juni 2020 Melden Share Geschrieben 28. Juni 2020 vor 5 Stunden schrieb MustafGames: O3. ist es bei Fixed-Function Shadern sinnvoll GPU Instancing zu nutzen oder geht das gar nicht? GPU-Instancing muss man in Unity über eine Klasse (Script) ansteuern und spezielle Methode aufrufen, wenn du das mit diesem Shader nicht geplant hast, dann kannst du den ganzen Block aus dem Shader rauswerfen, da es nie benutzt wird. HDRP und LWRP haben bereits ihren eigenen visuellen Shader-Editor (Shader Graph) integriert, hab ich aber auch noch nicht benutzt, ist aber für 3D Artists ein wichtiges Tool was schon eine Weile überfällig war. Für das "normale" Unity (nennt sich glaub Built-In Unity Renderer) gab es aber auch schon visuelle Editoren, aber nicht von Unity selbst. Ich würde um einen performanten Shader zu schreiben auch einen Shader verwenden mit Fragment und Vertex Funktion, weil nur hier siehst du was der Shader intern so treibt. Bei der "fancy" Shaderlab-Syntax oder der Syntax von Surface-Shadern treibt er ggf. einige Sachen im Hintergrund was wieder ungewollt Performance kosten kann. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.