Unterschied zwischen Material und Shader

27

In Spielen beeinflussen Materialien oft nur das visuelle Erscheinungsbild von Objekten. Das optische Erscheinungsbild wird durch Shader beeinflusst. Gibt es also einen terminologischen Unterschied zwischen Materialien und Shadern? Sollten Sie einen Shader für ein Material schreiben?

danijar
quelle
1
Ich habe einige Engines gesehen, in denen ein Material aus Shader + diffuser Textur + Bumpmap besteht, aber ich glaube nicht, dass es eine präzise Definition gibt.
Roy T.
3
@RoyT. Diese Motoren würden Terminologie missbrauchen. Ein Material ist nicht gleichbedeutend mit einem Shader - ein Shader ist ein Programm , ein Material ist ein Bündel von Datenwerten. 2 verschiedene Shader-Programme können dasselbe Material rendern und unterschiedliche Ergebnisse erzielen.
Bobobobo
@bobobobo Üblicherweise wird ein einziger Shader zum Rendern vieler Materialien verwendet, indem verschiedene Texturen, Parameterwerte usw. eingefügt werden.
Nathan Reed

Antworten:

29

Ein Material ist eine Kombination von Attributen, die beschreiben, wie eine Oberfläche des angegebenen Materials aussehen soll.

Einige Engines verwenden unterschiedliche Shader für unterschiedliche Materialien. In diesem Fall könnte eine Materialdefinition folgendermaßen aussehen:

[Material]
Shader=NormalMappedSpecular.glsl
Texture1=Rock.png
Texture2=RockNormal.png
Texture3=RockSpecular.png

Andere Engines verwenden einen Shader für alle Objekte (oder vielmehr die Engines entscheiden, welcher Shader verwendet werden soll, abhängig von den Parametern, den Fähigkeiten der GPU und anderen Faktoren wie der Entfernung). In diesem Fall würde ein Material ungefähr so ​​aussehen:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png
API-Biest
quelle
2
Kann man die Definition eines Materials nicht auf alle Sinne ausweiten, die von der Game-Engine unterstützt werden? Zum Beispiel die Geräusche, die das Material erzeugt, wenn es getroffen, getreten usw. wird, oder seine Reibungsparameter?
Didierc
10

Ein Material gibt an, wie ein Objekt auf Licht reagiert.

Es gibt einige allgemeine Parameter:

  • Kd: Diffuse Reaktion auf Licht
  • Ks: Spiegelnde Reaktion auf Licht
  • Ns: "Shininess"
  • map_Kd: Textur

Angenommen, Sie haben ein mit Material gerendertes Dreieck M. Mhat Kd = (1,0,0) (rote diffuse Antwort), Ks = (1,1,1) (weiße spiegelnde Antwort), Ns = 25 (spiegelnde Hervorhebung ist ziemlich scharf und nicht unscharf) und keine map_Kd ( keine Textur).

Die Aufgabe des Shaders besteht darin, mithilfe von Mathematik die Scheitelpunktpositionen des Dreiecks , die Position des Lichts, die Materialfarbwerte und die Farbe des Dreiecks zu ermitteln. Ein Vertex-Shader führt diese "Shading-Berechnung" einmal an jedem Vertex durch und interpoliert die Farbe über das Dreieck.

Eine häufige Operation in einem Shader zum Berechnen der diffusen Antwort an einem Scheitelpunkt ist:

// hlsl
float3 vertexToLight = normalize( lightPos.xyz - vertexPos.xyz ) ;

float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;
Bobobobo
quelle
3

Ein Material wird auf die Geometrie angewendet, um ihr Farbe und Muster zu verleihen. Eine Textur ist eine Komponente eines Materials.

Ein Shader ist ein kleines Programm, mit dem dieses Material zur Laufzeit gerendert werden kann. Das Schöne an Shadern ist, dass Sie alles tun können, vom einfachen Rendern des Materials über das Hinzufügen dynamischer Effekte wie Glanzlichter und Reflexionen bis hin zu äußerst cleveren Dingen wie dem Rendern von falschen Löchern in Wänden, in die eine Kugel getroffen wurde.

Als Antwort auf Ihre Frage - ja, es gibt einen Unterschied, es gibt auch eine kleine Überlappung - können Sie entweder ein rotes Material erstellen oder einen Shader schreiben, um die Dinge als rot darzustellen, aber beide ermöglichen Ihnen auch viele Dinge, die Sie tun konnte nicht mit dem anderen.

und nein, Sie brauchen nicht einen Shader pro Material. Obwohl für ein Material ein Shader zum Rendern erforderlich ist, können Sie einen für alle Materialien verwenden, wenn Sie dies möchten. Sie tun bestimmte Dinge. Wenn Sie zum Beispiel möchten, dass alles glänzend ist, können Sie einfach eine schreiben.

Ein schönes Beispiel für Shader sind Kriegsgeräte. Es gibt eine Reihe von Materialien für die Szene. Wenn Sie jedoch eine Taste drücken, um zur taktischen Ansicht zu wechseln, ändern sich die Shader, die diese Materialien rendern, so dass die Dinge umrissen und im Allgemeinen anders aussehen. Dasselbe passiert in Batman: Arkhams 'Detektivmodus'.

SirYakalot
quelle
1
Technisch gesehen ist eine Textur nicht wirklich ein Material für sich, sondern normalerweise Teil eines Materials.
Bobobobo
1

Obwohl es zu spät ist, gibt es einen "Betrüger", der Ihnen helfen kann, besser zu verstehen.

Ein Material ist alles, was einem bestimmten Shader für diesen Zeichenaufruf zugeordnet ist.

In der obigen Antwort haben Sie beispielsweise folgendes Material: [Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

Das bedeutet, dass Sie mit einem Shader rendern, der eine normale Karte und eine Spiegelberechnung durchführt, und die drei Texturen in diesem Shader verwendet.

Später können Sie denselben Shader mit verschiedenen anderen 3 Texturen (wie car, carNormal und carSpecular) wiederverwenden. Sie führen einen anderen Zeichenaufruf mit einem anderen Material aus, nur weil Sie die Shader-Parameter geändert haben.

Alles in allem ist ein Material alles, was einen Zeichenaufruf mit demselben Shader und denselben Parametern (Texturen, Uniformen, Attribute) auf einmal erstellt.

Ich hoffe, das hilft, es besser zu visualisieren

user1288789
quelle
ist es so etwas wie: der Shader ist die Klasse, aber das Material ist die Instanz?
Bengalaa,