Шейдеры: что менять на GPU
Выбрать материал или собственный shader, разделить стадии GPU и логику игры.
Выбрать инструмент
Шейдер задаёт, как GPU преобразует вершины и рассчитывает изображение поверхности. C# управляет игровыми объектами и передаёт параметры; shader-код обрабатывает данные рендеринга. Внутри fragment() нельзя вызывать Entity, читать файл сохранения или изменять CollisionShape3D.
| Задача | Инструмент |
|---|---|
| Цвет, текстуры, металличность, прозрачность без собственной формулы | StandardMaterial3D |
| Своя окраска, маска, растворение или деформация поверхности | ShaderMaterial и Shader |
| Индивидуальный оттенок мешей с общим материалом | instance uniform |
| Инвентарь, урон, сохранение, физическая форма | C# и соответствующие системы движка |
Сначала проверьте, достаточно ли StandardMaterial3D. Свой shader нужен для собственной формулы, а не для включения уже существующей настройки.
Понять стадии
vertex() выполняется для вершин меша: VERTEX содержит позицию, NORMAL — нормаль. Если плоскость состоит только из двух треугольников, vertex shader не создаст между ними новые вершины. Для рельефа нужна сетка с достаточной плотностью.
fragment() рассчитывает свойства видимой поверхности. В spatial shader задавайте ALBEDO, ROUGHNESS, METALLIC и другие нужные значения; освещение затем использует их. ALBEDO не равен гарантированному экранному цвету: результат зависит от света, окружения и tone mapping.
varying передаёт данные от vertex() к fragment() с интерполяцией между вершинами. В примере высота и крутизна склонов вычисляются на вершинах и участвуют в окраске материала. Это не хранение состояния игры между кадрами.
Связать код и материал
Shader — программа; ShaderMaterial — ресурс с программой и значениями обычных uniform. Назначьте материал в нужный слот MeshInstance3D. В текущем движке текстовый файл shader-ресурса имеет расширение .reckfellshader. Классы управления остаются в .cs.
| Shader-объявление | Что передавать из C# |
|---|---|
| float | float |
| vec2 / vec3 | Vector2 / Vector3 |
| vec4 с source_color | Color |
| sampler2D | Texture2D, например ImageTexture |
Имена чувствительны к регистру. SetShaderParameter меняет материал, SetInstanceShaderParameter — параметр конкретной геометрии, объявленный как instance uniform. Не путайте эти два пути.
GetShaderParameter читает сохранённый override. Если shader использует default, но материал его явно не задавал, в проверенной сборке getter возвращает Nil. Кроме того, опечатанное имя может сохраниться в кеше, не влияя на GPU. Проверяйте объявление, список uniform и реальный результат.
Продолжить на работающем примере
Первый 3D shader создаёт рельеф из карты высот и корректирует нормали. Материал и параметры объясняет PBR-окраску, индивидуальные значения, копии ресурсов и сохранение.
Оба урока используют один готовый проект, проверенный в текущем Forward+/Vulkan. Это начало работы со spatial shader, а не полная проверка всех типов shader, backend и возможностей языка.