Jump to content
Unity Insider Forum

Mobile Shader, einfach gehalten


MustafGames

Recommended Posts

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

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

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

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

  1. Wenn ich das richtig gesehen habe, kriegt Unity seit 2019.4 das mit dem Shader Build Caching vernünftig hin.
  2. 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

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...