effect-format.resource.vertex-2d |
Входной формат Vertex2D |
Эффекты ImGui, QuadSprite и Primitive получают из Vertex2D locations 0..3: позицию vec3, нормализованный цвет, текстурные координаты vec2 и egg/вспомогательные данные vec2. |
Не-модельные usage совместно используют одну нативную вершинную структуру, даже если шейдер игнорирует часть входов. |
Source/Frontend/Rendering.h, Resources/Core/Effects/2D_Default.fofx |
effect-format.resource.vertex-model |
Входной формат Vertex3D |
Эффекты Model получают locations 0..8: позицию, нормаль, основной UV, базовый UV, tangent, bitangent, веса смешивания, индексы смешивания и цвет. |
Все модельные шейдеры должны соответствовать фиксированному формату Vertex3D, настроенному каждым активным backend-ом. |
Source/Frontend/Rendering.h, Resources/Core/Effects/3D_Skinned.fofx |
effect-format.resource.native-descriptor-sets |
Нативное соглашение дескрипторов Vulkan |
Авторские нативные ресурсы шейдеров должны размещать uniform buffer-ы в descriptor set 0, а combined image sampler-ы в descriptor set 1. |
Rendering-Vulkan использует нативный SPIR-V без изменений; он же служит источником кросс-компиляции в GLSL, GLSL ES и HLSL. |
Source/Tools/EffectBaker.cpp, Resources/Core/Effects/2D_Default.fofx |
effect-format.resource.explicit-bindings |
Явные binding-и |
Каждый живой sampler и uniform block должен объявлять явный binding. Номера binding-ов должны быть уникальны внутри каждой стадии шейдера и класса ресурсов. |
Назначение слотов SDL_GPU сортирует авторские binding-и и переназначает их в плотные слоты каждой стадии. |
Source/Tools/EffectBaker.cpp |
effect-format.resource.samplers |
Sampler-ы рендерера |
Runtime предоставляет MainTex, IndoorMaskTex и BackgroundTex, а в 3D-сборках также ModelTex0..ModelTexN-1. BackgroundTex является переданным вызывающим кодом снимком сцены для рефракции. Другие отражённые имена sampler-ов RenderEffect не заполняет. |
Шейдер с другим именем sampler-а может скомпилироваться, но не получит текстурную привязку от Engine. |
Source/Tools/EffectBaker.cpp, Source/Frontend/Rendering.h |
effect-format.resource.general-buffers |
Общие uniform buffer-ы |
Распознаются ProjBuf, MainTexBuf, EggBuf, SpriteBorderBuf, ParticleSamplingBuf, TimeBuf, RandomValueBuf, ScriptValueBuf и CameraBuf. ParticleSamplingBuf задаётся вызывающим кодом для каждого вызова отрисовки и управляет выборкой текстур частиц и искажением. Объявления должны точно соответствовать нативным std140-совместимым layout-ам. |
EffectBaker проверяет отражённые размеры байтов относительно buffer-структур RenderEffect. |
Source/Tools/EffectBaker.cpp, Source/Frontend/Rendering.h |
effect-format.resource.model-buffers |
3D uniform buffer-ы |
Распознаются модельные buffer-ы ModelBuf, ModelTexBuf и ModelAnimBuf; MAX_BONES и MAX_TEXTURES предоставляет пролог baker-а. |
Эти layout-ы передают skinning, освещение, данные текстурного атласа и тайминги анимации модельным эффектам. |
Source/Tools/EffectBaker.cpp, Source/Frontend/Rendering.h |
effect-format.resource.script-values |
ScriptValueBuf |
Внутри ScriptValueBuf объявите ‘vec4 ScriptValue[MAX_SCRIPT_VALUES / 4]’. Плоский диапазон индексов для скриптов равен 0..EFFECT_SCRIPT_VALUES-1. |
Baker предоставляет MAX_SCRIPT_VALUES, а клиентский API записывает диапазоны float в тот же нативный buffer. |
Source/Tools/EffectBaker.cpp, Source/Frontend/Rendering.h |
effect-format.resource.time-random |
Buffer-ы кадра |
TimeBuf предоставляет FrameTime.x и GameTime.x как секунды от начала сессии с оборачиванием на 8192; RandomValueBuf предоставляет четыре независимых значения [0,1], обновляемых каждый кадр. |
Эти buffer-ы обновляются для каждого загруженного эффекта только тогда, когда reflection сообщает, что они ему нужны. |
Source/Client/EffectManager.cpp, Source/Frontend/Rendering.h |
effect-format.resource.camera |
Аффинные базисы CameraBuf |
CameraBuf содержит MapAnchorScreenPos и ChunkScreenAnchor. Шейдеры вычисляют любой базис как ‘.xy + TexCoord * .zw’, получая координаты, привязанные к миру или экрану. |
Масштабные компоненты сохраняют непрерывность на дополненных/разбитых на chunks render target-ах и при zoom. |
Source/Frontend/Rendering.h |
effect-format.resource.unsupported |
Неподдерживаемые ресурсы шейдера |
Неизвестные uniform block-и, storage buffer-ы и storage image отклоняются. Объявленные, но неиспользуемые descriptor resource отклоняются при патчинге SDL SPIR-V. |
Рендерер привязывает только фиксированный словарь buffer-ов и sampled textures. |
Source/Tools/EffectBaker.cpp |
effect-format.resource.sdl-limits |
Ограничения SDL_GPU на стадию |
Каждая стадия шейдера может использовать не более 16 sampler-ов и 4 uniform buffer-ов. Слоты уплотняются независимо для sampler-ов вершинной стадии, vertex UBO, sampler-ов фрагментной стадии и fragment UBO. |
SDL_CreateGPUShader требует количества для каждой стадии, а соглашение backend-а о дескрипторах отличается от нативного Vulkan. |
Source/Tools/EffectBaker.cpp |