Разница между материалом и шейдером

27

В играх материалы часто влияют только на внешний вид предметов. На внешний вид влияют шейдеры. Итак, что касается терминологии, есть ли разница между материалами и шейдерами? Должны ли вы написать один шейдер для одного материала?

Данияр
источник
1
Я видел несколько движков, где материал - это шейдер + диффузная текстура + рельефная карта, но я не думаю, что есть одно краткое определение.
Рой Т.
3
@RoyT. Эти двигатели будут неправильно использовать терминологию. Материал не эквивалентен шейдер - шейдер является программой , А материал представляет собой пучок значений данных. 2 разные шейдерные программы могут отображать один и тот же материал и получать разные результаты.
Бобобобо
@bobobobo Или, чаще всего, для рендеринга многих материалов используется один шейдер, подключая различные текстуры, значения параметров и тому подобное.
Натан Рид

Ответы:

29

Материал - это комбинация атрибутов, которые описывают, как должна выглядеть поверхность данного материала.

Некоторые движки используют разные шейдеры для разных материалов, и в этом случае определение материала может выглядеть следующим образом:

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

Другие движки используют один шейдер для всех объектов (точнее, движки решают, какой шейдер использовать, в зависимости от параметров, возможностей графического процессора и других факторов, таких как расстояние), и в этом случае материал будет выглядеть примерно так:

[Material]
Ambient=0.5
Specularity=0.7
DiffuseMap=Rock.png
NormalMap=RockNormal.png
SpecularMap=RockSpecular.png
API-Beast
источник
2
нельзя ли распространить определение материала на все чувства, поддерживаемые игровым движком? Например, звуки, которые материал будет издавать при ударе, наступлении и т. Д., Или его параметры трения?
Didierc
10

A Материал определяет , как объект реагирует на свет.

Есть пара общих параметров:

  • Kd: диффузный ответ на свет
  • Ks: зеркальный ответ на свет
  • Нс: "Блеск"
  • map_Kd: текстура

Теперь скажите, что у вас есть треугольник с материалом M. Mимеет Kd = (1,0,0) (красный диффузный отклик), Ks = (1,1,1) (белый зеркальный отклик), Ns = 25 (зеркальное выделение будет довольно резким и не размытым) и не отображает map_Kd ( нет текстуры).

Работа шейдера состоит в том, чтобы использовать математику для определения положения вершин треугольника , положения источника света, значений цвета материала и выяснения, какой цвет должен иметь треугольник. Вершинный шейдер выполняет это «вычисление затенения» один раз в каждой вершине и интерполирует цвет по всему треугольнику.

Обычная операция в шейдере для вычисления диффузного отклика в вершине:

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

float3 diffuseColor = max( dot( vertexToLight, vertexNormal ), 0.0 ) * kd * lightColor ;
bobobobo
источник
3

Материал - это то, что вы применяете к геометрии, чтобы придать ей цвет и рисунок. Текстура является компонентом материала.

Шейдер - это небольшая программа, которая позволяет отображать этот материал во время выполнения. Хорошая особенность шейдеров заключается в том, что вы можете делать все, от простого рендеринга материала, до добавления динамических эффектов, таких как зеркальные блики и отражения, вплоть до чрезвычайно умных вещей, таких как рендеринг искусственных отверстий в стенах, где попала пуля.

так что в ответ на ваш вопрос - да, есть разница, есть и небольшое совпадение - вы можете либо создать красный материал, либо написать шейдер, чтобы сделать вещи красным, но оба они также позволяют вам многое не мог с другой.

и нет, вам не нужен один шейдер на материал. хотя материал требует рендеринга шейдера, вы можете иметь его для всех материалов, если хотите. они делают определенные вещи, поэтому, если вы хотите, чтобы все было блестящим, например, вы могли бы просто написать один.

Хороший пример шейдеров в военном снаряжении. есть один набор материалов для сцены, но когда вы нажимаете кнопку, чтобы переключиться в тактическое представление, шейдеры, которые визуализируют эти материалы, изменяются, поэтому вещи выглядят намеченными и, как правило, отличаются. То же самое происходит с Бэтменом: «детективный режим» Аркхема.

SirYakalot
источник
1
Технически текстура сама по себе не является материалом , обычно это часть материала.
Бобобобо
1

Хотя и поздно, есть «чит», который поможет вам лучше понять.

Материал - это все, что связано с определенным шейдером для этого вызова.

Например, в приведенном выше ответе у вас есть этот материал: [Material] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

что означает, что вы будете рендерить с помощью шейдера, который выполняет карту нормалей и зеркальные вычисления, и он будет использовать 3 текстуры внутри этого шейдера.

Позже вы можете повторно использовать один и тот же шейдер с другими 3-мя текстурами (например, car, carNormal и carSpecular), вы будете выполнять другой вызов отрисовки с другим материалом только потому, что изменили параметры шейдера.

В общем, материал - это все, что уникально создает вызов отрисовки, используя один и тот же шейдер с одинаковыми параметрами (текстуры, униформа, атрибуты).

Я надеюсь, что это помогает лучше визуализировать это

user1288789
источник
это что-то вроде: шейдер - это класс, а материал - это пример?
Бенгала