Diferencia entre material y sombreador

27

En los juegos, los materiales a menudo solo influyen en la apariencia visual de los objetos. La apariencia visual se ve afectada por los sombreadores. Entonces, con respecto a la terminología, ¿hay alguna diferencia entre los materiales y los sombreadores? ¿Deberías escribir un sombreador para un material?

danijar
fuente
1
He visto algunos motores donde un material es un sombreador + textura difusa + mapa de relieve, pero no creo que haya una definición concisa.
Roy T.
3
@RoyT. Esos motores estarían haciendo mal uso de la terminología. Un material no es equivalente a un sombreador : un sombreador es un programa , un material es un conjunto de valores de datos. 2 programas de sombreado diferentes pueden renderizar el mismo material y obtener resultados diferentes.
bobobobo
@bobobobo O, más comúnmente, se usaría un solo sombreador para renderizar muchos materiales, al conectar diferentes texturas, valores de parámetros y demás.
Nathan Reed

Respuestas:

29

Un material es una combinación de atributos que describen cómo debería verse una superficie del material dado.

Algunos motores usan diferentes sombreadores para diferentes materiales, en cuyo caso una definición de material podría verse así:

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

Otros motores usan un sombreador para todos los objetos (o más bien los motores deciden qué sombreador usar dependiendo de los parámetros, las capacidades de la GPU y otros factores como la distancia), en cuyo caso un material se vería más así:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png
API-Bestia
fuente
2
¿No podría uno extender la definición de un material a todos los sentidos compatibles con el motor del juego? Por ejemplo, ¿los sonidos que producirá el material cuando sea golpeado, pisado, etc., o sus parámetros de fricción?
didierc
10

Un material especifica cómo responde un objeto a la luz.

Hay un par de parámetros comunes:

  • Kd: respuesta difusa a la luz
  • Ks: respuesta especular a la luz
  • Ns: "Shininess"
  • map_Kd: Texture

Ahora di que tienes un triángulo renderizado con material M. Mtiene Kd = (1,0,0) (respuesta difusa roja), Ks = (1,1,1) (respuesta especular blanca), Ns = 25 (el resaltado especular será bastante nítido y no borroso) y no map_Kd ( sin textura).

El trabajo del sombreador es usar las matemáticas para tomar las posiciones de vértice del triángulo , la posición de la luz, los valores de color del material y determinar de qué color debe aparecer el triángulo. Un sombreador de vértices realiza este "cálculo de sombreado" una vez en cada vértice e interpola el color a través del triángulo.

Una operación común en un sombreador para calcular la respuesta difusa en un vértice es:

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

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

Un material es lo que aplica a la geometría para darle un color y un patrón. Una textura es un componente de un material.

Un sombreador es un pequeño programa que permite procesar este material en tiempo de ejecución. Lo bueno de los sombreadores es que puedes hacer todo, desde simplemente renderizar el material, hasta agregar efectos dinámicos como reflejos y reflejos especulares hasta cosas extremadamente inteligentes, como hacer agujeros falsos a través de paredes donde una bala ha golpeado.

Entonces, en respuesta a su pregunta, sí, hay una diferencia, también hay una pequeña superposición: puede hacer un material rojo o escribir un sombreador para que las cosas se vean rojas, pero ambos también le permiten hacer muchas cosas No podría con el otro.

y no, no necesitas un sombreador por material. Aunque un material requiere un sombreador para ser renderizado, puede tener uno para todos sus materiales si lo desea. hacen cosas específicas, así que si quisieras que todo fuera brillante, por ejemplo, podrías escribir uno.

Un buen ejemplo de sombreadores es en gears of war. hay un conjunto de materiales para la escena, pero cuando presionas un botón para cambiar a la vista táctica, los sombreadores que procesan estos materiales cambian para que las cosas se vean contorneadas y generalmente diferentes. Lo mismo sucede en Batman: el 'modo detective' de Arkham.

Sir Yakalot
fuente
1
Técnicamente, una textura no es realmente un material en sí misma, generalmente es parte de un material.
bobobobo
1

Aunque tarde, hay un "truco" que puede ayudarlo a comprender mejor.

Un material es todo lo que se adjunta a un sombreador determinado para esa llamada de sorteo.

Por ejemplo, en la respuesta anterior, tiene este material: [Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

lo que tradujo que se renderizará con un sombreador que hace un mapa normal y un cálculo especular, y utilizará las 3 texturas dentro de ese sombreador.

Más adelante, puede volver a usar el mismo sombreador, con otras 3 texturas diferentes (como car, carNormal y carSpecular), realizará una llamada de dibujo diferente con un material diferente, solo porque cambió los parámetros del sombreador.

Con todo, un material es todo lo que crea de forma única una llamada de dibujo utilizando el mismo sombreador con los mismos parámetros (texturas, uniformes, atributos).

Espero que esto ayude a visualizarlo mejor

usuario1288789
fuente
¿Es algo así como: el sombreador es la clase, pero el material es la instancia?
Bengalaa