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


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

2
не можна було розширити визначення матеріалу на всі почуття, підтримувані ігровим двигуном? Наприклад, звуки, які матеріал видаватиме при попаданні, наступі тощо, або його параметри тертя?
didierc

10

А матеріал визначає , як об'єкт реагує на світло.

Є кілька загальних параметрів:

  • Kd: Дифузна реакція на світло
  • Кс: Зерна реакція на світло
  • Нс: "Сором'язливість"
  • 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 ;

3

Матеріал - це те, що ви застосовуєте до геометрії, щоб надати йому колір і візерунок. Текстура - складова матеріалу.

Шейдер - це невелика програма, яка дозволяє виводити цей матеріал під час виконання. Приємне в шейдерах полягає в тому, що ви можете зробити все - від простого рендерингу матеріалу, до додавання динамічних ефектів, таких як дзеркальні виділення та роздуми, аж до надзвичайно розумних речей, таких як промальовування фальшивих отворів через стіни, куди потрапила куля.

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

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

Гарний приклад шейдерів - у передачах війни. Є один набір матеріалів для сцени, але коли ви натискаєте кнопку, щоб перейти до тактичного вигляду, шейдери, які надають ці матеріали, змінюються, щоб речі виглядали окресленими і взагалі різними. Те ж саме відбувається і в Бетмена: "детективний режим" Аркхема.


1
Технічно текстура не є власне матеріалом , вона зазвичай є частиною матеріалу.
бобобобо

1

Незважаючи на запізнення, є "чит", який може допомогти вам зрозуміти краще.

Матеріал - це все, що додається до певного шейдера для цього дзвінка.

Наприклад, у наведеній вище відповіді у вас є цей матеріал: [Матеріал] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png

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

Згодом ви можете повторно використовувати той же шейдер, з різними іншими 3 текстурами (наприклад, автомобіль, автомобільНормал і автомобільСпекуляр), ви будете робити різний дзвінок з різним матеріалом, тільки тому, що ви змінили параметри шейдера.

Загалом, матеріал - це все, що однозначно створює дзвінок за малюнком, використовуючи той самий шейдер з однаковими параметрами (текстури, обмундирування, атрибути).

Я сподіваюся, що це допомагає краще візуалізувати це


це щось на кшталт: шейдер - це клас, але матеріал - це примірник?
Бенгалаа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.