RDShaderFile
Именованные варианты SPIR-V, ошибки и сериализация shader-ресурса.
RDShaderFile — Resource с именованными вариантами SPIR-V и общей ошибкой разбора. Это не spatial/canvas Shader для ShaderMaterial и не GPU RID. SetBytecode сохраняет ссылку, а не компилирует исходный текст; GPU-шейдер создаётся отдельно через RenderingDevice. Для исходного текста используйте RDShaderSource.
Параметр version — имя варианта внутри файла, например zeta, а не версия движка. Пропущенное значение выбирает пустое имя. Оно не означает «первый доступный вариант»: GetSpirV с отсутствующим ключом выдаёт native error и возвращает null. GetVersionList возвращает отдельный список, отсортированный по именам; сначала проверьте нужный ключ. Новый RDShaderFile не содержит ни одной версии.
Проверяйте три независимые вещи: BaseError файла, ошибку нужной стадии у выбранного RDShaderSpirV и наличие её bytecode. Пустой BaseError не означает успех. Этот выполненный helper берёт только Compute выбранной версии и создаёт принадлежащий вызывающему коду GPU shader:
using System;
using System.Collections.Generic;
using Reckfell;
public static class ShaderVersions
{
// Creates an owned GPU shader containing only the selected compute stage.
// Use the device's valid call context; free the RID on the same device.
public static Rid CreateCompute(RenderingDevice device, RDShaderFile file, string version = "")
{
ArgumentNullException.ThrowIfNull(device);
ArgumentNullException.ThrowIfNull(file);
ArgumentNullException.ThrowIfNull(version);
if (!string.IsNullOrEmpty(file.BaseError))
throw new InvalidOperationException(file.BaseError);
using var name = new StringName(version);
var names = file.GetVersionList();
using var namesOwner = (Reckfell.Collections.Array)names;
if (!names.Contains(name)) throw new KeyNotFoundException("Shader version is absent.");
var stored = file.GetSpirV(name); // Borrowed shared resource: do not Dispose.
if (!string.IsNullOrEmpty(stored.CompileErrorCompute))
throw new InvalidOperationException(stored.CompileErrorCompute);
byte[] bytes = stored.BytecodeCompute;
if (bytes.Length == 0) throw new InvalidOperationException("Compute bytecode is empty.");
using var computeOnly = new RDShaderSpirV { BytecodeCompute = bytes };
Rid shader = device.ShaderCreateFromSpirV(computeOnly);
if (!shader.IsValid) throw new InvalidOperationException("GPU shader creation failed.");
return shader;
}
}Helper не загружает файл и не компилирует GLSL. Передайте существующий RDShaderFile и допустимый RenderingDevice. Он отбрасывает другие стадии при создании computeOnly; это не валидатор graphics/ray-tracing pipeline. После успешного вызова создайте ComputePipeline и uniform set с layout этого шейдера. Полный цикл dispatch/readback: compute и данные.
GetSpirV возвращает общий объект, который может одновременно храниться под несколькими именами. Не Dispose его как отдельную копию и не меняйте stage errors/bytecode для случайного редактирования одного варианта. Для независимого варианта создайте отдельный RDShaderSpirV. Getter _Versions копирует словарь, но не объекты значений; это внутреннее свойство сериализации, а не рекомендуемый интерфейс редактора. SetBytecode заменяет совпадающий ключ и вызывает Changed. SetBaseError тоже вызывает Changed, даже при повторной записи строки.
Описание файла не владеет GPU RID. ShaderCreateFromSpirV создаёт отдельный ресурс конкретного устройства; освободите его через тот же FreeRid после завершения работы. Основной RenderingDevice заимствован и не должен освобождаться вашим кодом; локальное устройство и его ресурсы обслуживает создавший их компонент. Используйте правильный поток/контекст устройства.
На установленном Windows/Vulkan Forward+ проверены хранение общего bytecode, имена/замена вариантов, Changed, копирование контейнеров, сохранение и загрузка .rdata и точный helper. Реальный compute после загрузки удвоил исходный storage buffer. Правка RDUniform после UniformSetCreate не поменяла уже созданную GPU-привязку; освобождение bound buffer инвалидировало dependent set, хотя копия RID осталась ненулевой. Предупреждение загрузчика Vulkan сохранено. Не проверены импорт текстовых shader-файлов, graphics/ray stages, другие драйверы/платформы, изображения или производительность.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
RDShaderFileКонструктор
public RDShaderFile();Создаёт Resource с пустым BaseError и без версий bytecode. Это ещё не корректный GPU-шейдер: пустая строка ошибки не означает наличие стадий или успешную компиляцию.
Свойства2
BaseErrorСвойство
public string BaseError { get; set; }Общая ошибка разбора файла, изначально пустая. Setter только сохраняет текст и вызывает Changed, даже при повторе значения. Не очищает версии, ошибки отдельных стадий и bytecode; установка пустой строки не компилирует и не исправляет шейдер.
_VersionsСвойство
public Reckfell.Collections.Dictionary _Versions { get; set; }Внутренний словарь сериализации: имя → общий RDShaderSpirV. Getter создаёт новый контейнер, сохраняя общие значения. Setter очищает прежние версии и заново заполняет карту; неподходящие значения пропускаются с native error. Не используйте как обычный интерфейс редактирования: предпочитайте SetBytecode/GetVersionList/GetSpirV.
Методы5
GetBaseErrorstring
public string GetBaseError();Возвращает сохранённую общую ошибку. Пустая строка не заменяет проверку CompileErrorCompute/других стадий и фактического bytecode выбранной версии.
stringСохранённая общая ошибка; пустая строка сама по себе не означает успех.
GetSpirVRDShaderSpirV
public RDShaderSpirV GetSpirV(StringName version = null);Возвращает общий RDShaderSpirV указанной версии, не независимую копию. Не Dispose заимствованный результат и не меняйте его случайно: несколько версий могут ссылаться на один объект. Пропущенная версия означает пустой ключ; отсутствующий ключ вызывает native error и даёт null, без выбора другой версии. Сначала проверяйте GetVersionList.
| Имя | Тип | По умолчанию |
|---|---|---|
version | StringName | null |
versionТочное имя варианта шейдера. Пропущенное значение соответствует пустому имени, не версии продукта Reckfell.
RDShaderSpirVЗаимствованный общий RDShaderSpirV; null и native error для отсутствующего имени.
GetVersionListReckfell.Collections.Array<StringName>
public Reckfell.Collections.Array<StringName> GetVersionList();Возвращает новый контейнер имён, отсортированных по именам. Пустое имя обозначает default-версию и присутствует только если она сохранена. Список может быть пустым; порядок не является порядком SetBytecode. Изменение контейнера не меняет файл.
Reckfell.Collections.Array<StringName>Отдельный Array<StringName> с отсортированными именами, возможно пустой.
SetBaseErrorvoid
public void SetBaseError(string error);Сохраняет текст общей ошибки и вызывает Changed без сравнения со старой строкой. Это запись диагностики, а не компиляция, очистка stage errors или пересоздание GPU shader.
| Имя | Тип | По умолчанию |
|---|---|---|
error | string | — |
errorСохраняемое сообщение общей ошибки; пустая строка очищает только это поле.
SetBytecodevoid
public void SetBytecode(RDShaderSpirV bytecode, StringName version = null);Сохраняет ссылку на RDShaderSpirV под указанным именем; совпадающий ключ заменяется, затем вызывается Changed. Bytecode должен быть ненулевым объектом, но его стадии и ошибки этим методом не проверяются. Не компилирует текст и не создаёт GPU RID. Разные имена могут разделять один объект.
| Имя | Тип | По умолчанию |
|---|---|---|
bytecode | RDShaderSpirV | — |
version | StringName | null |
bytecodeНенулевой RDShaderSpirV, сохраняемый по ссылке; ошибки и отсутствие стадий не отклоняются этим setter.
versionТочное имя варианта шейдера. Пропущенное значение соответствует пустому имени, не версии продукта Reckfell.