Миграции шейдерных блоков
Введение
Система шейдерных блоков материалов движка PlayCanvas претерпевает существенные изменения для поддержки более гибкой системы материалов. Пожалуйста, посмотрите эту страницу для получения дополнительной информации.
Чтобы помочь пользователям перенести свои существующие пользовательские шейдерные блоки, на этой странице перечислены изменения, внесенные в блоки, и организованы по выпуску движка (начиная с v1.51).
Версии API блоков
Отладочная версия движка будет сообщать об изменениях API в консоли выполнения, когда обнаружит переопределенные блоки. Например:
После того, как блоки приложения будут обновлены до последней версии API, их необходимо пометить как таковые. Например, после обновления пользовательских блоков материала до последнего выпуска движка (скажем, v1.55), укажите это в объекте блоков следующим образом:
material.chunks.diffusePS = '...';
material.chunks.APIVersion = pc.CHUNKAPI_1_55;
При этом вы больше не будете видеть предупреждающих сообщений в консоли.
Изменения в чанках
В следующих таблицах разбиваются изменения чанков по выпускам Engine.
Engine v1.62
В PlayCanvas у нас есть два набора чанков шейдеров, один набор мы называем фронтендом шейдера, который предоставляет значения для аргументов, передаваемых нашему алгоритму освещения, также называемому бэкендом шейдера.
С версией 1.62 мы создаем более четкое разделение между этими двумя, так что значения, передаваемые на бэкенд, хорошо определены и известны заранее, а не генерируются автоматически. Это позволяет написать полностью настраиваемый шейдер, который может взаимодействовать с нашим кодом освещения так же, как это делают наши собственные материалы.
В результате этого почти все чанки бэкенда были изменены для адаптации к разделению. Это означает, что любые пользовательские чанки шейдеров бэкенда должны перейти от использования глобальных переменных к использованию аргументов, передаваемых им бэкендом освещения.
Это изменение также делает некоторые чанки, такие как специфические для clearcoat, избыточными, поскольку их функции становятся многоразовыми, когда они больше не зависят от глобальных значений.
Изменения
Этот выпуск нарушает большинство lit/frag чанков. Большинство этих чанков имели измененные сигнатуры для принятия различных значений, которые им нужны, вместо опоры на глобальные переменные. Сказав это, большинство глобальных переменных все еще устанавливаются в шейдере. Примером этого изменения является:
vec3 combineColor() {
vec3 ret = vec3(0);
ret = dAlbedo * dDiffuseLight;
...
}
Теперь выражено:
vec3 combineColor(vec3 albedo, vec3 sheenSpecularity, float clearcoatSpecularity) {
vec3 ret = vec3(0);
ret = albedo * dDiffuseLight;
...
}
Где ранее у нас были глобальные переменные, в 1.62 они упакованы в структуры, основными из которых являются LitShaderArgs, определенные следующим образом:
struct LitShaderArguments
{
// Прозрачность
float opacity;
// Направление нормали в мировом пространстве
vec3 worldNormal;
// Поглощение альбедо поверхности
vec3 albedo;
// Коэффициент преломления (передачи), диапазон [0..1]
float transmission;
// Равномерная толщина среды, используемая для передачи, диапазон [0..inf]
float thickness;
// Фактор спекулярности f0
vec3 specularity;
// Фактор глянцевости микрограней, диапазон [0..1]
float gloss;
// Фактор металличности поверхности, диапазон [0..1]
float metalness;
// Фактор интенсивности спекулярности, диапазон [0..1]
float specularityFactor;
// Количество окклюзии окружающей среды, диапазон [0..1]
float ao;
// Цвет излучения
vec3 emission;
// Цвет карты освещения
vec3 lightmap;
// Направление карты освещения
vec3 lightmapDir;
// Аргументы расширения иридесценции
IridescenceArgs iridescence;
// Аргументы расширения Clearcoat
ClearcoatArgs clearcoat;
// Аргументы расширения Sheen
SheenArgs sheen;
};
Последние три аргумента являются нашими расширениями для шейдинга. IridescenceArgs определен следующим образом:
struct IridescenceArgs
{
// Интенсивность эффекта иридесценции, диапазон [0..1]
float intensity;
// Толщина иридесцентного микрослоя, значение в нанометрах, диапазон [0..1000]
float thickness;
};
ClearcoatArgs:
- Issue Tracker: Issue Tracker
- Tutorial Thumbnail: Tutorial Thumbnail
Entity:
- Issue Tracker: Issue Tracker
- Tutorial Thumbnail: Tutorial Thumbnail
Material Asset:
- Issue Tracker: Issue Tracker
- Material Inspector: Material Inspector
Shader Editor:
- Issue Tracker: Issue Tracker
- Node Inspector: Node Inspector
- Texture Inspector: Texture Inspector
- Graph Inspector: Graph Inspector
- Graph Editor: Graph Editor
Assets:
- Issue Tracker: Issue Tracker
- Asset: Asset
struct ClearcoatArgs
{
// Интенсивность слоя Clearcoat, диапазон [0..1]
float specularity;
// Глянцевость слоя Clearcoat, диапазон [0..1]
float gloss;
// Нормаль, используемая для слоя Clearcoat
vec3 worldNormal;
};
SheenArgs:
struct SheenArgs
{
// Глянцевость слоя блеска, диапазон [0..1]
float gloss;
// Цвет коэффициента спекулярности f0 для слоя блеска
vec3 specularity;
};
Chunk | Изменения |
---|---|
ambient(Constant/Env/SH) |
|
aoDiffuseOcc |
|
aoSpec(Occ/OccConst/OccConstSimple/OccSimple) |
|
combine |
|
clusteredLight |
|
clusteredLightShadow |
|
combine |
|
end |
|
fallOff(InvSquared/Linear) |
|
fresnelSchlick |
|
iridescenceDiffraction |
|
lightDiffuseLambert |
|
lightSheen |
|
lightSpecular(AnisoGGX/Blinn/Phong) |
|
lightmap(DirAdd/Add) |
|
ltc |
|
metalnessModulate |
|
output(Alpha/AlphaPremul) |
|
reflDir(Aniso) |
|
reflection(CC/Cube/Env/EnvHQ/Sphere/SphereLow) |
|
reflectionSheen |
|
refraction(Cube/Dynamic) |
|
shadow(Common/Coord/CoordPerspZBuffer |
|
shadow(EVSM/EVSMn/Standard/StandardGL2/VSM8) |
|
spot |
|
TBN(-/ObjectSpace/derivative/fast) |
|
Engine v1.60
Chunk | Изменения |
---|---|
clearCoatGlossPS |
|
glossPS |
|
sheenGlossPS |
|
Engine v1.57
В 1.57 почти все фронт-енд чанки были изменены для минимизации количества сэмплеров, используемых шейдером. Это необязательная функция, однако рекомендуется следовать тому же стилю кодирования, чтобы уменьшить количество сэмплеров, используемых шейдером. Следующие чанки затронуты этим:
Chunk |
---|
aoPS |
clearCoatPS |
clearCoatGlossPS |
clearCoatNormalPS |
diffusePS |
diffuseDetailMapPS |
emissivePS |
metalnessPS |
normalMapPS |
normalDetailMapPS |
opacityPS |
parallaxPS |
sheenPS |
sheenGlossPS |
specularPS |
specularityFactorPS |
thicknessPS |
transmissionPS |
Это также поддерживается в пользовательских фронт-енд чанках, при условии, что ваш чанк использует предварительно существующие сэмплеры материала. Чтобы поддержать этот метод в ваших чанках, вам нужно будет:
- Удалить объявление униформы сэмплера из чанка
- Заменить имя сэмплера макросом
$SAMPLER
Например:
uniform sampler2D texture_aoMap;
void getAO() {
dAo = 1.0;
#ifdef MAPTEXTURE
dAo *= texture2DBias(texture_aoMap, $UV, textureBias).$CH;
#endif
#ifdef MAPVERTEX
dAo *= saturate(vVertexColor.$VC);
#endif
}
Было бы преобразовано в:
void getAO() {
dAo = 1.0;
#ifdef MAPTEXTURE
dAo *= texture2DBias($SAMPLER, $UV, textureBias).$CH;
#endif
#ifdef MAPVERTEX
dAo *= saturate(vVertexColor.$VC);
#endif
}
Это позволяет движку автоматически выбирать uniform сэмплер для использования, тем самым потенциально сокращая общее количество сэмплеров. Но обратите внимание, что это поддерживается только для фронтенд-чанков.
Движок v1.56
Chunk | Изменения |
---|---|
combineXXXX |
|
refractionPS |
|
refractionCubePS |
|
refractionDynamicPS |
|
sheenPS |
|
sheenGlossPS |
|
reflectionEnvHQPS |
|
thicknessPS |
|
bakeDirLmEndPs |
|
bakeLmEndPS |
|
Движок v1.55
Chunk | Изменения |
---|---|
clearCoatNormalPS |
|
clusteredLightPS |
|
combinePS |
|
combineXXXX |
|
diffusePS |
|
diffuseDetailMapPS |
|
endPS |
|
emissivePS |
|
fresnelSchlickPS |
|
lightmapSingleVert.js |
|
lightmapDirPS , lightmapSinglePS |
|
lightmapAddPS , lightmapDirAddPS |
|
lightSpecularAnisoGGXPS |
|
lightSpecularBlinnPS , lightSpecularPhongPS |
|
ltcPS |
|
normalMapFastPS |
|
normalMapPS |
|
normalDetailMapPS |
|
normalVertexPS |
|
metalnessPS |
|
metalnessModulatePS |
|
reflectionCC |
|
specularAaNonePS , specularAaToksvigPS , specularAaToksvigFastPS |
|
startPS |
|
specularPS |
|
specularityFactorPS |
|