CompositorEffect
Базовый ресурс callback для стадии compositor.
Создайте C#-подкласс, переопределите _RenderCallback и добавьте ресурс в Compositor.CompositorEffects. По умолчанию эффект включён, стадия PostTransparent, все флаги дополнительных данных выключены. Без собственного callback базовый ресурс не создаёт визуального результата.
Forward+ вызывает пять стадий; текущий Mobile — только PreOpaque, PreTransparent и PostTransparent. Запрос PostOpaque в Mobile выдаёт предупреждение; PostSky там не вызывается. PostTransparent выполняется перед последующей постобработкой и tonemapping. Не используйте Max как стадию.
Полный проверенный диагностический класс. Он считает callback и кадры с действующими RID всех view, но не выполняет compute shader и не меняет изображение:
using System.Threading;
using Reckfell;
[GlobalClass]
public partial class BufferProbeEffect : CompositorEffect
{
private int callbacks;
private int validFrames;
public int CallbackCount => Volatile.Read(ref callbacks);
public int ValidFrameCount => Volatile.Read(ref validFrames);
public BufferProbeEffect()
{
EffectCallbackType = EffectCallbackTypeEnum.PostTransparent;
}
public override void _RenderCallback(int effectCallbackType, RenderData renderData)
{
if (effectCallbackType != (int)EffectCallbackTypeEnum.PostTransparent)
return;
Interlocked.Increment(ref callbacks);
if (renderData.GetRenderSceneBuffers() is not RenderSceneBuffersRD buffers)
return;
Vector2I size = buffers.GetInternalSize();
if (size.X <= 0 || size.Y <= 0 || buffers.GetViewCount() == 0)
return;
for (uint view = 0; view < buffers.GetViewCount(); view++)
{
if (!buffers.GetColorLayer(view).IsValid || !buffers.GetDepthLayer(view).IsValid)
return;
}
Interlocked.Increment(ref validFrames);
}
}RenderData и буферы заимствованы у рендерера. Не сохраняйте их после callback, не освобождайте чужие RID и не меняйте дерево Entity с render thread. Размер берите из GetInternalSize(), обрабатывайте все GetViewCount() слои. Для GPU-работы нужен основной RenderingDevice; local device не владеет RID кадра.
Диспетчеризация, действующие RID и Enabled проверены в Windows/Vulkan Forward+ и Mobile. Предупреждение неподдерживаемого PostOpaque сохранено в исходном отчёте. Дополнительные буферы и MSAA сверены по исходникам; их содержимое, shader, XR, resize и производительность этим прогоном не проверены.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
CompositorEffectКонструктор
public CompositorEffect();Создаёт включённый базовый эффект на PostTransparent со всеми дополнительными флагами false. Базовый callback сам не изменяет изображение; переопределите _RenderCallback в подклассе.
Свойства7
AccessResolvedColorСвойство
public bool AccessResolvedColor { get; set; }Запрос обычного цветового буфера после resolve MSAA перед промежуточной стадией; изначально false. Не отключает MSAA и не преобразует формат в LDR. В Inspector скрыт для PostTransparent. Запрашивайте только при необходимости; действующий RID не означает, что ранняя стадия уже содержит готовый цвет сцены.
AccessResolvedDepthСвойство
public bool AccessResolvedDepth { get; set; }Запрос глубины после resolve MSAA, изначально false. Поддержка зависит от renderer и устройства; true не гарантирует доступность resolved depth во всех конфигурациях. В Inspector скрыт для PostTransparent. Это не линейная глубина и не переключатель reverse-Z.
EffectCallbackTypeСвойство
public CompositorEffect.EffectCallbackTypeEnum EffectCallbackType { get; set; }Стадия вызова, по умолчанию PostTransparent. Forward+ вызывает PreOpaque, PostOpaque, PostSky, PreTransparent и PostTransparent. В текущем Mobile выполняются только PreOpaque, PreTransparent и PostTransparent: PostOpaque выдаёт предупреждение, PostSky не вызывается. PostTransparent предшествует последующей постобработке и tonemapping. Max — служебное значение, не допустимая стадия.
EnabledСвойство
public bool Enabled { get; set; }Включён ли эффект; по умолчанию true. False исключает его из диспетчеризации, но не удаляет ресурс или созданные им GPU-объекты. Изменение действует без повторного назначения массива CompositorEffects; уже поставленные кадры могут завершиться со старым состоянием.
NeedsMotionVectorsСвойство
public bool NeedsMotionVectors { get; set; }Запрашивает подготовку векторов движения в Forward+; изначально false. Это потребность эффекта, а не подтверждение наличия буфера в любом renderer. Включение может изменить подготовку рендеринга; не запрашивайте неиспользуемые данные.
NeedsNormalRoughnessСвойство
public bool NeedsNormalRoughness { get; set; }Запрашивает normal/roughness в Forward+ и влияет на подготовку prepass; изначально false. Не делает эти данные доступными в Mobile автоматически. Проверяйте подходящий буфер и стадию перед использованием.
NeedsSeparateSpecularСвойство
public bool NeedsSeparateSpecular { get; set; }Запрашивает отдельный specular в Forward+ на PostSky; изначально false. Для других стадий свойство скрыто в Inspector. Mobile не вызывает PostSky в текущей реализации. Это запрос данных, а не автоматический визуальный эффект.
Методы15
GetAccessResolvedColorbool
public bool GetAccessResolvedColor();Возвращает значение CompositorEffect.AccessResolvedColor.
boolТекущее значение CompositorEffect.AccessResolvedColor; чтение флага не подтверждает доступность соответствующего буфера.
GetAccessResolvedDepthbool
public bool GetAccessResolvedDepth();Возвращает значение CompositorEffect.AccessResolvedDepth.
boolТекущее значение CompositorEffect.AccessResolvedDepth; чтение флага не подтверждает доступность соответствующего буфера.
GetEffectCallbackTypeCompositorEffect.EffectCallbackTypeEnum
public CompositorEffect.EffectCallbackTypeEnum GetEffectCallbackType();Возвращает значение CompositorEffect.EffectCallbackType.
CompositorEffect.EffectCallbackTypeEnumВыбранная стадия. Её выполнение зависит от renderer и подключения compositor.
GetEnabledbool
public bool GetEnabled();Возвращает значение CompositorEffect.Enabled.
boolTrue, если эффект включён; это не подтверждение фактического callback для активной камеры.
GetNeedsMotionVectorsbool
public bool GetNeedsMotionVectors();Возвращает значение CompositorEffect.NeedsMotionVectors.
boolТекущее значение CompositorEffect.NeedsMotionVectors; чтение флага не подтверждает доступность соответствующего буфера.
GetNeedsNormalRoughnessbool
public bool GetNeedsNormalRoughness();Возвращает значение CompositorEffect.NeedsNormalRoughness.
boolТекущее значение CompositorEffect.NeedsNormalRoughness; чтение флага не подтверждает доступность соответствующего буфера.
GetNeedsSeparateSpecularbool
public bool GetNeedsSeparateSpecular();Возвращает значение CompositorEffect.NeedsSeparateSpecular.
boolТекущее значение CompositorEffect.NeedsSeparateSpecular; чтение флага не подтверждает доступность соответствующего буфера.
SetAccessResolvedColorvoid
public void SetAccessResolvedColor(bool enable);Назначает значение CompositorEffect.AccessResolvedColor.
| Имя | Тип | По умолчанию |
|---|---|---|
enable | bool | — |
enableНовое значение запроса CompositorEffect.AccessResolvedColor.
SetAccessResolvedDepthvoid
public void SetAccessResolvedDepth(bool enable);Назначает значение CompositorEffect.AccessResolvedDepth.
| Имя | Тип | По умолчанию |
|---|---|---|
enable | bool | — |
enableНовое значение запроса CompositorEffect.AccessResolvedDepth.
SetEffectCallbackTypevoid
public void SetEffectCallbackType(CompositorEffect.EffectCallbackTypeEnum effectCallbackType);Назначает значение CompositorEffect.EffectCallbackType.
| Имя | Тип | По умолчанию |
|---|---|---|
effectCallbackType | CompositorEffect.EffectCallbackTypeEnum | — |
effectCallbackTypeДопустимая стадия с учётом renderer; не Max. Текущий Mobile не выполняет PostOpaque и PostSky.
SetEnabledvoid
public void SetEnabled(bool enabled);Назначает значение CompositorEffect.Enabled.
| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
enabledTrue для включения, false для исключения из callback; свойство CompositorEffect.Enabled.
SetNeedsMotionVectorsvoid
public void SetNeedsMotionVectors(bool enable);Назначает значение CompositorEffect.NeedsMotionVectors.
| Имя | Тип | По умолчанию |
|---|---|---|
enable | bool | — |
enableНовое значение запроса CompositorEffect.NeedsMotionVectors.
SetNeedsNormalRoughnessvoid
public void SetNeedsNormalRoughness(bool enable);Назначает значение CompositorEffect.NeedsNormalRoughness.
| Имя | Тип | По умолчанию |
|---|---|---|
enable | bool | — |
enableНовое значение запроса CompositorEffect.NeedsNormalRoughness.
SetNeedsSeparateSpecularvoid
public void SetNeedsSeparateSpecular(bool enable);Назначает значение CompositorEffect.NeedsSeparateSpecular.
| Имя | Тип | По умолчанию |
|---|---|---|
enable | bool | — |
enableНовое значение запроса CompositorEffect.NeedsSeparateSpecular.
_RenderCallbackvoid
public virtual void _RenderCallback(int effectCallbackType, RenderData renderData);Hook рендерера для выбранной стадии. Переопределяйте в подклассе, не вызывайте вручную вместо рендеринга. RenderData и его буферы используйте только в пределах callback; не сохраняйте их на следующий кадр и не освобождайте чужие RID. Не меняйте дерево Entity и UI на render thread. Для XR обрабатывайте каждый view, размер берите из RenderSceneBuffersRD.GetInternalSize().
| Имя | Тип | По умолчанию |
|---|---|---|
effectCallbackType | int | — |
renderData | RenderData | — |
effectCallbackTypeНомер фактически вызванной стадии; сравнивайте с EffectCallbackTypeEnum. Это не число эффектов и не индекс кадра.
renderDataЗаимствованные данные текущего прохода; действуют только внутри callback. Получите RenderSceneBuffers и проверьте конкретный тип.
CompositorEffect.EffectCallbackTypeEnum
| Значение | Описание |
|---|---|
Max = 5 | Представляет размер перечисления |
PostOpaque = 1 | Обратный вызов выполняется после прохода рендеринга непрозрачности, но до рендеринга неба. |
PostSky = 2 | Обратный вызов вызывается после того, как наше небо отрисовано, но до создания наших обратных буферов (и, если они включены, до подповерхностного рассеивания и/или отражений в пространстве экрана). |
PostTransparent = 4 | Обратный вызов выполняется после прохода прозрачного рендеринга, но до любых встроенных эффектов постобработки и вывода на нашу цель рендеринга. |
PreOpaque = 0 | Обратный вызов выполняется перед нашим проходом рендеринга непрозрачности, но после предварительного прохода глубины (если применимо). |
PreTransparent = 3 | Обратный вызов выполняется до прохода прозрачного рендеринга, но после того, как небо отрисовано и мы создали обратные буферы. |