Оформление шейдеров: читаемость и безопасное редактирование
Законченный пример, порядок, имена и отличия форматирования от изменения поведения.
Единое оформление помогает быстро найти входы шейдера, работу этапов и проверку границ. Сам стиль не меняет выполнение; порядок объявлений, имена и hints менять поведение могут.
Полный пример
Сохраните как StyledReveal.reckfellshader и назначьте через ShaderMaterial видимому ColorRect:
shader_type canvas_item;
render_mode unshaded;
uniform vec4 tint : source_color = vec4(1.0);
uniform float reveal_amount : hint_range(0.0, 1.0) = 1.0;
void fragment() {
float boundary = clamp(reveal_amount, 0.0, 1.0);
if (UV.x > boundary) {
discard;
}
COLOR = tint;
}По умолчанию видна полная белая карточка. При reveal_amount=0.5 остаётся левая половина, tint=red меняет её цвет. Граница ограничивается явно: hint_range настраивает только Inspector. Отрицательные/превышающие единицу значения и видимый результат проверены.
Порядок и имена
Сначала shader_type/render_mode, затем include/константы, связанные группы uniform, varying/struct, помощники перед вызывающими их функциями и функции этапов. Локальные переменные объявляйте рядом с первым использованием и инициализируйте до чтения.
Для функций, параметров и uniform используйте понятные snake_case, для констант и макросов — UPPER_CASE. При необходимости отражайте единицы/пространство: time_seconds, uv_offset, viewport_size. Переименование uniform требует обновить setter в C#, сохранённые значения материалов и остальных потребителей: это изменение API, а не форматирование.
Используйте xy/xyz для геометрии, rgb/rgba для цвета; не меняйте семейства без причины. Аргументы макросов заключайте в скобки, а обычные повторяемые вычисления выносите в типизированные функции.
Раскладка текста
- UTF-8 без BOM, переводы строк LF, один завершающий перевод строки.
- Один способ отступов на проект; в примерах четыре пробела. Не смешивайте табуляцию и пробелы в одном файле.
- Один оператор на строку, фигурные скобки у управляющих блоков, пробелы вокруг бинарных операторов.
- Пустые строки между группами входов и функциями; длинные выражения переносите по смысловым операторам или аргументам.
- Явные вещественные литералы вроде 0.5; различайте целые/вещественные типы при выборе перегрузок.
- Комментарий объясняет координаты, владение, нетривиальную формулу или измеренное ограничение. Удаляйте пересказ следующей строки.
Проверяйте изменения по смыслу
После автоформатирования просмотрите diff. Универсальный форматтер C/C++ может не понимать shader_type, hints или препроцессор. Сохраняйте директивы и продолжающие строку обратные косые черты. Не скрывайте за форматированием другой blend mode, присваивание альфа, source_color или переименование публичного uniform: это изменения поведения.
После изменения семантики проверьте компиляцию и показательный результат рендеринга. Clamp, discard и tint этого примера проверены на GPU; статья не предполагает наличие конкретного меню редактора или интеграции форматтера.