Diferença entre Material e Shader

27

Nos jogos, os materiais geralmente influenciam apenas a aparência visual dos objetos. A aparência visual é efetuada por shaders. Então, com relação à terminologia, existe uma diferença entre materiais e shaders? Você deve escrever um shader para um material?

danijar
fonte
11
Eu já vi alguns mecanismos em que um material é um shader + textura difusa + bumpmap, mas não acho que exista uma definição concisa.
19412 Roy T.
3
@RoyT. Esses mecanismos estariam usando mal a terminologia. Um material não é equivalente a um shader - um shader é um programa , um material é um monte de valores de dados. 2 programas shader diferentes podem renderizar o mesmo material e obter resultados diferentes.
amigos estão dizendo sobre bobobobo
@obobobo Ou, mais comumente, um único sombreador seria usado para renderizar muitos materiais, inserindo diferentes texturas, valores de parâmetros e outros.
22812 Nathan Reed

Respostas:

29

Um material é uma combinação de atributos que descrevem como deve ser a superfície de um determinado material.

Alguns motores usam sombreadores diferentes para materiais diferentes; nesse caso, uma definição de material pode ter a seguinte aparência:

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

Outros mecanismos usam um sombreador para todos os objetos (ou melhor, os motores decidem qual sombreador usar, dependendo dos parâmetros, dos recursos da GPU e de outros fatores como a distância); nesse caso, um material seria mais parecido com isto:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png
API-Beast
fonte
2
não se poderia estender a definição de um material a todos os sentidos suportados pelo mecanismo de jogo? Por exemplo, os sons que o material produzirá quando atingido, pisado, etc., ou seus parâmetros de atrito?
didierc
10

Um material especifica como um objeto responde à luz.

Existem alguns parâmetros comuns:

  • Kd: Resposta difusa à luz
  • Ks: resposta especular à luz
  • Ns: "Brilho"
  • map_Kd: Textura

Agora diga que você tem um triângulo processado com material M. Mtem Kd = (1,0,0) (resposta difusa em vermelho), Ks = (1,1,1) (resposta especular em branco), Ns = 25 (o destaque especular será bastante nítido e sem distorção) e nenhum map_Kd ( sem textura).

O trabalho do shader é usar a matemática para assumir as posições dos vértices do triângulo , a posição da luz, os valores da cor do material e descobrir qual cor o triângulo deve aparecer. Um sombreador de vértice faz esse "cálculo de sombreamento" uma vez em cada vértice e interpola a cor através do triângulo.

Uma operação comum em um shader para calcular a resposta difusa em um vértice é:

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

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

Um material é o que você aplica à geometria para fornecer uma cor e um padrão. Uma textura é um componente de um material.

Um sombreador é um pequeno programa que permite que esse material seja renderizado em tempo de execução. O bom dos shaders é que você pode fazer de tudo, desde renderizar o material, adicionar efeitos dinâmicos como reflexos especulares e reflexões até coisas extremamente inteligentes, como fazer buracos falsos nas paredes onde uma bala atingiu.

então, em resposta à sua pergunta - sim, há uma diferença, também há uma pequena sobreposição - você pode criar um material vermelho ou escrever um sombreador para tornar as coisas vermelhas, mas as duas também permitem que você faça muitas coisas não poderia com o outro.

e não, você não precisa de um shader por material. embora um material exija a renderização de um shader, você pode ter um para todos os seus materiais, se desejar. eles fazem coisas específicas; portanto, se você quiser que tudo fique brilhante, por exemplo, basta escrever um.

Um bom exemplo de shaders é em artes de guerra. existe um conjunto de materiais para a cena, mas quando você pressiona um botão para alternar para a visão tática, os shaders que estão processando esses materiais mudam para que as coisas pareçam delineadas e geralmente diferentes. O mesmo acontece no batman: o 'modo de detetive' de Arkham.

SirYakalot
fonte
11
Tecnicamente, uma textura não é realmente um material por si só, geralmente faz parte de um material.
amigos estão dizendo sobre bobobobo
1

Embora atrasado, existe um "truque" que pode ajudá-lo a entender melhor.

Um material é tudo o que está anexado a um determinado sombreador para essa chamada de empate.

Por exemplo, na resposta acima, você tem este material: [Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

que traduziu que você renderizará com um sombreador que faz um mapa normal e uma computação especular e usará as três texturas dentro desse sombreador.

Posteriormente, você pode reutilizar o mesmo shader, com outras 3 texturas diferentes (como car, carNormal e carSpecular), você fará uma chamada de desenho diferente com um material diferente, apenas porque alterou os parâmetros do shader.

Em suma, um material é tudo o que cria exclusivamente uma chamada de empate usando o mesmo sombreador com os mesmos parâmetros (texturas, uniformes, atributos).

Espero que isso ajude a visualizar melhor

user1288789
fonte
é algo como: o shader é a classe, mas o material é a instância?
Bengalaa