В іграх матеріали часто впливають лише на візуальний вигляд предметів. На візуальний вигляд впливають шейдери. Тож щодо термінології є різниця між матеріалами та шейдерами? Чи слід написати один шейдер для одного матеріалу?
В іграх матеріали часто впливають лише на візуальний вигляд предметів. На візуальний вигляд впливають шейдери. Тож щодо термінології є різниця між матеріалами та шейдерами? Чи слід написати один шейдер для одного матеріалу?
Відповіді:
Матеріал - це сукупність атрибутів, які описують, як повинна виглядати поверхня даного матеріалу.
Деякі двигуни використовують різні шейдери для різних матеріалів, і в цьому випадку визначення матеріалу може виглядати так:
[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
А матеріал визначає , як об'єкт реагує на світло.
Є кілька загальних параметрів:
Тепер скажіть, що у вас є трикутник, поданий з матеріалом 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 ;
Матеріал - це те, що ви застосовуєте до геометрії, щоб надати йому колір і візерунок. Текстура - складова матеріалу.
Шейдер - це невелика програма, яка дозволяє виводити цей матеріал під час виконання. Приємне в шейдерах полягає в тому, що ви можете зробити все - від простого рендерингу матеріалу, до додавання динамічних ефектів, таких як дзеркальні виділення та роздуми, аж до надзвичайно розумних речей, таких як промальовування фальшивих отворів через стіни, куди потрапила куля.
тож у відповідь на ваше запитання - так, є різниця, є і невелике перекриття - ви можете або зробити червоний матеріал, або написати шейдер, щоб зробити речі червоними, але обидва вони також дозволяють вам зробити багато речей не могли з іншим.
і ні, вам не потрібен один шейдер на матеріал. хоча для матеріалу потрібен шейдер, ви можете мати його для всіх матеріалів, якби хотіли. вони роблять конкретні речі, тож якщо ви хотіли, щоб, наприклад, все було блискучим, ви можете просто написати один.
Гарний приклад шейдерів - у передачах війни. Є один набір матеріалів для сцени, але коли ви натискаєте кнопку, щоб перейти до тактичного вигляду, шейдери, які надають ці матеріали, змінюються, щоб речі виглядали окресленими і взагалі різними. Те ж саме відбувається і в Бетмена: "детективний режим" Аркхема.
Незважаючи на запізнення, є "чит", який може допомогти вам зрозуміти краще.
Матеріал - це все, що додається до певного шейдера для цього дзвінка.
Наприклад, у наведеній вище відповіді у вас є цей матеріал: [Матеріал] Shader = NormalMappedSpecular.glsl Texture1 = Rock.png Texture2 = RockNormal.png Texture3 = RockSpecular.png
що перекладає, що ви будете візуалізувати за допомогою шейдера, який робить звичайну карту і дзеркальне обчислення, і він буде використовувати 3 текстури всередині цього шейдера.
Згодом ви можете повторно використовувати той же шейдер, з різними іншими 3 текстурами (наприклад, автомобіль, автомобільНормал і автомобільСпекуляр), ви будете робити різний дзвінок з різним матеріалом, тільки тому, що ви змінили параметри шейдера.
Загалом, матеріал - це все, що однозначно створює дзвінок за малюнком, використовуючи той самий шейдер з однаковими параметрами (текстури, обмундирування, атрибути).
Я сподіваюся, що це допомагає краще візуалізувати це