User Manual

Миграции шейдерных блоков

Введение

Система шейдерных блоков материалов движка 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:

Entity:

Material Asset:

Shader Editor:

Assets:

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)
  • Принимает vec3 для мировой нормали вместо использования dNormalW
aoDiffuseOcc
  • Принимает значение float для AO вместо использования dAO
aoSpec(Occ/OccConst/OccConstSimple/OccSimple)
  • Принимает float gloss, float ao, vec3 мировую нормаль и vec3 направление просмотра вместо использования dGlossiness, dAo, dNormalW и dViewDirW
combine
  • Принимает vec3 для альбедо, sheen specularity и float для clearcoat specularity вместо использования dAlbedo, sSpecularity и ccSpecularity
clusteredLight
  • Зависимость от глобальных переменных сокращена до dLightPosW, dLightDirW, dLightDirNormW и dShadowCoord, которые инициализируются для каждого источника света
clusteredLightShadow
  • Для omni-света генерирует локальную переменную вместо использования dShadowCoord. Для прожекторов принимает координату тени вместо использования dShadowCoord, как раньше
combine
  • Принимает vec3 альбедо, vec3 sheen specularity и float clearcoat specularity вместо использования dAlbedo, sSpecularity и ccSpecularity
end
  • Передает альбедо, sheen specularity и clearcoat specularity в combine с использованием litShaderArgs, использует litShaderArgs.emission вместо опоры на dEmission
fallOff(InvSquared/Linear)
  • Принимает float радиус света и vec3 направление света вместо использования dLightDirW
fresnelSchlick
  • Принимает gloss и IridescenceArgs вместо опоры на dGlossiness, dIridescenceFresnel и dIridescence
iridescenceDiffraction
  • Принимает float в качестве толщины иридесценции вместо использования dIridescenceThickness
lightDiffuseLambert
  • Принимает vec3 мировую нормаль, vec3 направление просмотра, vec3 направление света и vec3 нормализованное направление света вместо использования dNormalW, dViewDirW, dLightDirW и dLightDirNormW
lightSheen
  • Принимает vec3 полувектор, vec3 мировую нормаль, vec3 направление просмотра, vec3 нормализованное направление света и float gloss вместо опоры на dNormalW, dViewDirW, dLightDirNormW и dGlossiness
lightSpecular(AnisoGGX/Blinn/Phong)
  • Принимает vec3 полувектор для отражения, vec3 направление отражения (используется только для Phong), vec3 мировую нормаль, vec3 направление просмотра, значение float gloss и матрицу 3x3 для TBN, вместо опоры на dReflDirW, dNormalW, dViewDirW, dGlossiness/ccGlossiness и dTBN
lightmap(DirAdd/Add)
  • Принимает vec3 значение карты освещения, vec3 направление карты освещения, vec3 мировую нормаль, vec3 направление просмотра, float gloss, vec3 specularity, read-write vec3 нормализованное направление света, vec3 геометрическую нормаль и IridescenceArgs вместо опоры на dLightMap, dLightmapDir, dNormalW, dViewDirW, dGlossiness, dVertexNormalW и dSpecularity
ltc
  • Больше не использует dViewDirW, dNormalW, dGlossiness, dSpecularity, ccGlossiness, ccSpecularity и dLightDirW, но вместо этого полагается на их значения, передаваемые в качестве аргументов
metalnessModulate
  • Принимает структуру LitShaderArguments, которая обновляется блоком. Удаляет зависимость от dSpecularity, dMetalness и dAlbedo
output(Alpha/AlphaPremul)
  • Использует litShaderArgs.opacity вместо dAlpha
reflDir(Aniso)
  • Принимает vec3 мировую нормаль, vec3 направление просмотра, значение float для gloss и матрицу 3x3 для TBN, вместо использования dGlossiness, dViewDirW, dNormalW и dTBN
reflection(CC/Cube/Env/EnvHQ/Sphere/SphereLow)
  • Принимает vec3 направление отражения и значение float gloss вместо использования dReflDirW/ccReflDirW и dGlossiness
reflectionSheen
  • Принимает vec3 мировую нормаль, vec3 направление просмотра и значение float gloss вместо использования dNormalW, dViewDirW и sGlossiness
refraction(Cube/Dynamic)
  • Принимает vec3 мировую нормаль, float толщину, float gloss, vec3 specularity, vec3 альбедо, float transmission и IridescenceArgs вместо использования dNormalW, dAlbedo, dTransmission, dThickness, dGlossiness, dSpecularity и передает аргументы иридесценции в функцию френеля
shadow(Common/Coord/CoordPerspZBuffer
  • Принимает перестановку vec3 направления света, vec3 позиции света, vec3 нормализованного направления света и vec3 геометрической нормали вместо использования dLightDirW, dLightPosW, dLightDirNormW и dVertexNormalW и принимает их в качестве аргументов. Перестановка зависит от требований для различных функций координат тени
shadow(EVSM/EVSMn/Standard/StandardGL2/VSM8)
  • Принимает vec3 координату выборки тени вместо использования dShadowCoord
spot
  • Принимает vec3 нормализованное направление света вместо использования dLightDirNormW
TBN(-/ObjectSpace/derivative/fast)
  • Принимает vec3 касательную, бинормаль и нормаль вместо использования dTangentW, dBinormalW и dNormalW

Engine v1.60

Chunk Изменения
clearCoatGlossPS
  • Переименована униформа material_clearCoatGlossiness в material_clearCoatGloss.
glossPS
  • Переименована униформа material_glossiness в material_gloss.
sheenGlossPS
  • Переименована униформа material_sheenGlossiness в material_sheenGloss.

Engine v1.57

В 1.57 почти все фронт-енд чанки были изменены для минимизации количества сэмплеров, используемых шейдером. Это необязательная функция, однако рекомендуется следовать тому же стилю кодирования, чтобы уменьшить количество сэмплеров, используемых шейдером. Следующие чанки затронуты этим:

Chunk
aoPS
clearCoatPS
clearCoatGlossPS
clearCoatNormalPS
diffusePS
diffuseDetailMapPS
emissivePS
metalnessPS
normalMapPS
normalDetailMapPS
opacityPS
parallaxPS
sheenPS
sheenGlossPS
specularPS
specularityFactorPS
thicknessPS
transmissionPS

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

Например:

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
  • все комбинированные чанки, кроме combinePS, были удалены.
  • вместо этого, combinePS контролируется с помощью нескольких определений препроцессора.
refractionPS
  • разделен на два новых чанка, refractionCubePS и refractionDynamicPS.
refractionCubePS
  • старый refractionPS идентичен этому, использует кубическую карту для преломлений.
refractionDynamicPS
  • новый чанк, который поддерживает динамические преломления с использованием захвата, требует установки requestSceneColorMap(true); на камере для работы.
sheenPS
  • новый чанк для предоставления блеска (ткань) цвета.
sheenGlossPS
  • новый чанк для предоставления блеска (ткань) глянца.
reflectionEnvHQPS
  • новый чанк для предоставления высококачественной спекулярной карты окружения для отражений и преломлений.
thicknessPS
  • новый чанк для предоставления толщины, которая изменяет цвет затухания для прозрачных (прозрачных/преломляющих) материалов.
bakeDirLmEndPs
  • перемещено в chunks-lightmapper.js.
bakeLmEndPS
  • перемещено в chunks-lightmapper.js.

Движок v1.55

Chunk Изменения
clearCoatNormalPS
  • воздержаться от генерации мирового отражения CC, теперь это делается на бэкенде
  • нормализовать итоговую нормаль в мировом пространстве
clusteredLightPS
  • удалить мертвый код.
  • макросы CLUSTER_XXX были переименованы в LIT_XXX.
  • каждый свет рассчитывает френель
combinePS
  • новый чанк для замены всех других комбинированных чанков.
combineXXXX
  • вариации комбинированных чанков считаются устаревшими и заменены одним чанком.
diffusePS
  • исправление обработки гаммы относительно детализации альбедо
diffuseDetailMapPS
  • гамма-коррекция детальной карты перед объединением с базовым альбедо
endPS
  • объединить эмиссию с dEmissive вместо вызова getEmission()
  • макрос CLEARCOAT теперь LIT_CLEARCOAT.
emissivePS
  • установить глобальный dEmission вместо возврата значения, чтобы привести его в соответствие с другими компонентами фронтенда
fresnelSchlickPS
  • эффект френеля теперь реагирует на показатель преломления.
  • больше не изменяет глобальную спекулярность, но возвращает значение для использования на свете и для окружения
lightmapSingleVert.js
  • удалено (не используется)
lightmapDirPS, lightmapSinglePS
  • переименована функция карты освещения в getLightMap() вместо addLightMap()
  • изменена реализация для записи глобальных dLightmap и dLightmapDir вместо обновления dDiffuseLight и dSpecularLight напрямую
  • бэкенд теперь обрабатывает объединение карты освещения в lightmapAddPS и lightmapDirAddPS
lightmapAddPS, lightmapDirAddPS
  • новые чанки для добавления значений карты освещения, переданных из бэкенда
  • макрос CLEARCOAT заменен на LIT_CLEARCOAT.
lightSpecularAnisoGGXPS
  • определение CLEARCOAT заменено на LIT_CLEARCOAT
lightSpecularBlinnPS, lightSpecularPhongPS
  • добавлено определение CLEARCOAT, удален вызов antiAliasGlossiness()
ltcPS
  • макрос CLEARCOAT заменен на LIT_CLEARCOAT.
normalMapFastPS
  • удалено
normalMapPS
  • добавлено определение MAPTEXTURE, как и в других чанках
  • нормализовать итоговую нормаль
  • когда текстура нормали не определена, рассчитать нормаль из геометрической нормали
normalDetailMapPS
  • удалить два (в основном) ненужных вызова normalize - вместо этого нормализовать итоговую нормаль
normalVertexPS
  • удален чанк, функциональность перемещена в фронтенд-чанк normalMapPS
metalnessPS
  • теперь контролирует металличность на переднем плане и не является исключительным для specularPS
metalnessModulatePS
  • новый блок для контроля модуляции цвета отражения на основе цвета отражения и альбедо с учетом металличности
reflectionCC
  • определение CLEARCOAT заменено на LIT_CLEARCOAT.
specularAaNonePS, specularAaToksvigPS, specularAaToksvigFastPS
  • удалены
startPS
  • удалены глобальные объявления, генерируйте их по запросу вместо этого
  • макрос CLEARCOAT заменен на LIT_CLEARCOAT.
specularPS
  • предоставляет только цвет отражения, модуляция металличности теперь выполняется в бэкенде.
specularityFactorPS
  • новый блок для контроля интенсивности отражения для рабочего процесса с металличностью.
This site is translated by the community. If you want to get involved visit this page