Namespaces de recursos#
Los atributos de recursos pertenecen a cada proyecto de sintaxis, no a YotsubaShader.Language.Resources. El vocabulario SPIR-V actual utiliza atributos separados DescriptorSet y Binding. No existe un constructor compartido Binding(set, binding) ni un enum ResourceAccess.
using YotsubaShader.HlslSyntax.Resources;
public struct Settings
{
public float Exposure;
}
public class Resources
{
[cbuffer, register(RegisterPrefix.b, 0)]
public Settings Settings;
[register(RegisterPrefix.u, 0)]
public RWStructuredBuffer<float> Values;
}
StorageBuffer no tiene una propiedad Access. Utiliza las declaraciones específicas de sintaxis mostradas abajo; GLSL y SPIR-V utilizan el mismo marcador de buffer para ambos ejemplos y no expresan una opción de solo lectura mediante ese marcador.
using YotsubaShader.Language;
using YotsubaShader.HlslSyntax;
using YotsubaShader.HlslSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[cbuffer, register(RegisterPrefix.b, 0)]
public Material Material;
// Storage buffer de lectura y escritura
[register(RegisterPrefix.u, 0)]
public RWStructuredBuffer<float> Output;
// Storage buffer de solo lectura
[register("t0")]
public StructuredBuffer<float> Input;
}
using YotsubaShader.Language;
using YotsubaShader.GlslSyntax;
using YotsubaShader.GlslSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[uniform, layout(0, 0)]
public Material Material;
// Storage buffer de lectura y escritura
[buffer, layout(0, 1)]
public float[] Output;
// Storage buffer de solo lectura (el mismo atributo)
[buffer, layout(0, 2)]
public float[] Input;
}
using YotsubaShader.Language;
using YotsubaShader.MslSyntax;
using YotsubaShader.MslSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[constant, buffer(0)]
public Material Material;
// Storage buffer de lectura y escritura
[device, buffer(1)]
public float[] Output;
// Storage buffer de solo lectura
[device(readOnly: true), buffer(2)]
public float[] Input;
}
using YotsubaShader.Language;
using YotsubaShader.SpirvSyntax;
using YotsubaShader.SpirvSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[Uniform, DescriptorSet(0), @Binding(0)]
public Material Material;
// Storage buffer de lectura y escritura
[StorageBuffer, DescriptorSet(0), @Binding(1)]
public float[] Output;
// Storage buffer de solo lectura (el mismo atributo)
[StorageBuffer, DescriptorSet(0), @Binding(2)]
public float[] Input;
}
using YotsubaShader.Language;
using YotsubaShader.WgslSyntax;
using YotsubaShader.WgslSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[uniform, @group(0), @binding(0)]
public Material Material;
// Storage buffer de lectura y escritura
[storage(storage_use.read_write), @group(0), @binding(1)]
public float[] Output;
// Storage buffer de solo lectura
[storage(storage_use.read), @group(0), @binding(2)]
public float[] Input;
}
Existen metadatos de recursos y conceptos de bindings. No se debe asumir que la carga automática, el descubrimiento completo de campos, las operaciones sobre arrays GPU y la integración de layout/reflexión funcionen de extremo a extremo.
