reckfellENGINE

RDShaderFile

Именованные варианты SPIR-V, ошибки и сериализация shader-ресурса.

На этой странице
class RDShaderFileReckfellSharpНаследует Resource

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:

C#
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Конструктор
# RDShaderFile
C#
public RDShaderFile();

Создаёт Resource с пустым BaseError и без версий bytecode. Это ещё не корректный GPU-шейдер: пустая строка ошибки не означает наличие стадий или успешную компиляцию.

Свойства2

BaseErrorСвойство
# BaseError
C#
public string BaseError { get; set; }

Общая ошибка разбора файла, изначально пустая. Setter только сохраняет текст и вызывает Changed, даже при повторе значения. Не очищает версии, ошибки отдельных стадий и bytecode; установка пустой строки не компилирует и не исправляет шейдер.

_VersionsСвойство
# _Versions
C#
public Reckfell.Collections.Dictionary _Versions { get; set; }

Внутренний словарь сериализации: имя → общий RDShaderSpirV. Getter создаёт новый контейнер, сохраняя общие значения. Setter очищает прежние версии и заново заполняет карту; неподходящие значения пропускаются с native error. Не используйте как обычный интерфейс редактирования: предпочитайте SetBytecode/GetVersionList/GetSpirV.

Методы5

GetBaseErrorstring
# GetBaseError
C#
public string GetBaseError();

Возвращает сохранённую общую ошибку. Пустая строка не заменяет проверку CompileErrorCompute/других стадий и фактического bytecode выбранной версии.

Возвращает string

Сохранённая общая ошибка; пустая строка сама по себе не означает успех.

GetSpirVRDShaderSpirV
# GetSpirV
C#
public RDShaderSpirV GetSpirV(StringName version = null);

Возвращает общий RDShaderSpirV указанной версии, не независимую копию. Не Dispose заимствованный результат и не меняйте его случайно: несколько версий могут ссылаться на один объект. Пропущенная версия означает пустой ключ; отсутствующий ключ вызывает native error и даёт null, без выбора другой версии. Сначала проверяйте GetVersionList.

Параметры
ИмяТипПо умолчанию
versionStringNamenull
version

Точное имя варианта шейдера. Пропущенное значение соответствует пустому имени, не версии продукта Reckfell.

Возвращает RDShaderSpirV

Заимствованный общий RDShaderSpirV; null и native error для отсутствующего имени.

GetVersionListReckfell.Collections.Array<StringName>
# GetVersionList
C#
public Reckfell.Collections.Array<StringName> GetVersionList();

Возвращает новый контейнер имён, отсортированных по именам. Пустое имя обозначает default-версию и присутствует только если она сохранена. Список может быть пустым; порядок не является порядком SetBytecode. Изменение контейнера не меняет файл.

Возвращает Reckfell.Collections.Array<StringName>

Отдельный Array<StringName> с отсортированными именами, возможно пустой.

SetBaseErrorvoid
# SetBaseError
C#
public void SetBaseError(string error);

Сохраняет текст общей ошибки и вызывает Changed без сравнения со старой строкой. Это запись диагностики, а не компиляция, очистка stage errors или пересоздание GPU shader.

Параметры
ИмяТипПо умолчанию
errorstring—
error

Сохраняемое сообщение общей ошибки; пустая строка очищает только это поле.

SetBytecodevoid
# SetBytecode
C#
public void SetBytecode(RDShaderSpirV bytecode, StringName version = null);

Сохраняет ссылку на RDShaderSpirV под указанным именем; совпадающий ключ заменяется, затем вызывается Changed. Bytecode должен быть ненулевым объектом, но его стадии и ошибки этим методом не проверяются. Не компилирует текст и не создаёт GPU RID. Разные имена могут разделять один объект.

Параметры
ИмяТипПо умолчанию
bytecodeRDShaderSpirV—
versionStringNamenull
bytecode

Ненулевой RDShaderSpirV, сохраняемый по ссылке; ошибки и отсутствие стадий не отклоняются этим setter.

version

Точное имя варианта шейдера. Пропущенное значение соответствует пустому имени, не версии продукта Reckfell.

Документация Reckfell EngineНаверх ↑
БЫСТРЫЙ ПЕРЕХОДНачало работыEntity и иерархияC# & .NET 10Сцены и префабы
Руководства и полный API Reckfell K
reckfellENGINE
RECKFELL ACCOUNT

Вход в аккаунт

Войдите в аккаунт Reckfell.

Один аккаунт для всей платформы Reckfell.