Différence entre le matériau et le shader

27

Dans les jeux, les matériaux n'influencent souvent que l'apparence visuelle des objets. L'apparence visuelle est effectuée par des shaders. En ce qui concerne la terminologie, y a-t-il une différence entre les matériaux et les shaders? Devriez-vous écrire un shader pour un matériau?

danijar
la source
1
J'ai vu quelques moteurs où un matériau est un shader + une texture diffuse + un bumpmap, mais je ne pense pas qu'il y ait une définition concise.
Roy
3
@RoyT. Ces moteurs utiliseraient mal la terminologie. Un matériau n'est pas équivalent à un shader - un shader est un programme , un matériau est un ensemble de valeurs de données. 2 programmes de shader différents peuvent rendre le même matériau et obtenir des résultats différents.
bobobobo
@bobobobo Ou plus communément, un seul shader serait utilisé pour rendre de nombreux matériaux, en branchant différentes textures, valeurs de paramètres, etc.
Nathan Reed

Réponses:

29

Un matériau est une combinaison d'attributs qui décrivent à quoi devrait ressembler une surface du matériau donné.

Certains moteurs utilisent différents shaders pour différents matériaux, auquel cas une définition de matériau pourrait ressembler à ceci:

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

D'autres moteurs utilisent un shader pour tous les objets (ou plutôt les moteurs décident quel shader utiliser en fonction des paramètres, des capacités du GPU et d'autres facteurs tels que la distance), auquel cas un matériau ressemblerait davantage à ceci:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png
API-Beast
la source
2
ne pourrait-on pas étendre la définition d'un matériau à tous les sens pris en charge par le moteur de jeu? Par exemple, les sons que le matériau produira lorsqu'il sera frappé, piétiné, etc., ou ses paramètres de frottement?
didierc
10

Un matériau spécifie comment un objet réagit à la lumière.

Il existe quelques paramètres communs:

  • Kd: réponse diffuse à la lumière
  • Ks: réponse spéculaire à la lumière
  • Ns: "Shininess"
  • map_Kd: Texture

Supposons maintenant que vous ayez un triangle rendu avec de la matière M. Ma Kd = (1,0,0) (réponse diffuse rouge), Ks = (1,1,1) (réponse spéculaire blanche), Ns = 25 (la surbrillance spéculaire sera assez nette et non floue) et pas map_Kd ( pas de texture).

Le travail du shader consiste à utiliser les mathématiques pour prendre les positions des sommets du triangle , la position de la lumière, les valeurs de couleur du matériau et déterminer la couleur du triangle. Un vertex shader effectue ce "calcul d'ombrage" une fois à chaque sommet et interpole la couleur à travers le triangle.

Une opération courante dans un shader pour calculer la réponse diffuse au sommet est:

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

float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;
bobobobo
la source
3

Un matériau est ce que vous appliquez à la géométrie pour lui donner une couleur et un motif. Une texture est un composant d'un matériau.

Un shader est un petit programme qui permet de rendre ce matériau au moment de l'exécution. La bonne chose à propos des shaders est que vous pouvez tout faire, du simple rendu du matériau à l'ajout d'effets dynamiques tels que les reflets et les reflets spéculaires jusqu'à des choses extrêmement intelligentes telles que le rendu de faux trous à travers les murs où une balle a frappé.

donc en réponse à votre question - oui il y a une différence, il y a aussi un petit chevauchement - vous pouvez soit faire un matériau rouge ou écrire un shader pour rendre les choses en rouge, mais les deux vous permettent également de beaucoup de choses que vous ne pouvait pas avec l'autre.

et non, vous n'avez pas besoin d'un shader par matériau. bien qu'un matériau nécessite un shader pour être rendu, vous pouvez en avoir un pour tous vos matériaux si vous le souhaitez. ils font des choses spécifiques, donc si vous voulez que tout soit brillant par exemple, vous pouvez simplement en écrire un.

Un bel exemple de shaders est engrenages de guerre. il y a un ensemble de matériaux pour la scène, mais lorsque vous appuyez sur un bouton pour passer en vue tactique, les shaders qui rendent ces matériaux changent de sorte que les choses semblent décrites et généralement différentes. La même chose se produit dans Batman: le «mode détective» d'Arkham.

SirYakalot
la source
1
Techniquement, une texture n'est pas vraiment un matériau en soi, elle fait généralement partie d'un matériau.
bobobobo
1

Bien que tardif, il existe un "cheat" qui peut vous aider à mieux comprendre.

Un matériau est tout ce qui est attaché à un certain shader pour cet appel de tirage.

Par exemple, dans la réponse ci-dessus, vous avez ce matériau: [Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

ce qui signifie que vous allez rendre avec un shader qui fait une carte normale et un calcul spéculaire, et il utilisera les 3 textures à l'intérieur de ce shader.

Plus tard, vous pouvez réutiliser le même shader, avec différentes 3 autres textures (comme car, carNormal et carSpecular), vous effectuerez un appel de dessin différent avec un matériau différent, simplement parce que vous avez modifié les paramètres du shader.

Dans l'ensemble, un matériau est tout ce qui crée un appel de dessin de manière unique en utilisant le même shader avec les mêmes paramètres (textures, uniformes, attributs).

J'espère que cela aide à mieux le visualiser

user1288789
la source
est-ce quelque chose comme: le shader est la classe, mais le matériau est l'instance?
Bengalaa