Uniform and storage buffers#
These are declaration examples with binding slots. Access markers differ by syntax; the GLSL and SPIR-V examples do not distinguish read-only access.
using YotsubaShader.Language;
using YotsubaShader.HlslSyntax;
using YotsubaShader.HlslSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, with its binding slot
[cbuffer, register(RegisterPrefix.b, 0)]
public Material Material;
// Read/write storage buffer
[register(RegisterPrefix.u, 0)]
public RWStructuredBuffer<float> Output;
// Read-only storage buffer
[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, with its binding slot
[uniform, layout(0, 0)]
public Material Material;
// Read/write storage buffer
[buffer, layout(0, 1)]
public float[] Output;
// Read-only storage buffer (same attribute)
[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, with its binding slot
[constant, buffer(0)]
public Material Material;
// Read/write storage buffer
[device, buffer(1)]
public float[] Output;
// Read-only storage buffer
[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, with its binding slot
[Uniform, DescriptorSet(0), @Binding(0)]
public Material Material;
// Read/write storage buffer
[StorageBuffer, DescriptorSet(0), @Binding(1)]
public float[] Output;
// Read-only storage buffer (same attribute)
[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, with its binding slot
[uniform, @group(0), @binding(0)]
public Material Material;
// Read/write storage buffer
[storage(storage_use.read_write), @group(0), @binding(1)]
public float[] Output;
// Read-only storage buffer
[storage(storage_use.read), @group(0), @binding(2)]
public float[] Input;
}
Textures and samplers#
A texture and a sampler bound to their slots.
using YotsubaShader.HlslSyntax;
using YotsubaShader.HlslSyntax.Resources;
public class Surface
{
[register(RegisterPrefix.t, 0)]
public Texture2D Albedo;
// The same register, written as a string: letter + number
[register("s0")]
public SamplerState Sampler;
}
using YotsubaShader.GlslSyntax;
using YotsubaShader.GlslSyntax.Resources;
public class Surface
{
[layout(0, 0)]
public Texture2D Albedo;
[layout(0, 1)]
public SamplerState Sampler;
}
using YotsubaShader.MslSyntax;
using YotsubaShader.MslSyntax.Resources;
public class Surface
{
[texture(0)]
public Texture2D Albedo;
[sampler(0)]
public SamplerState Sampler;
}
using YotsubaShader.SpirvSyntax;
using YotsubaShader.SpirvSyntax.Resources;
public class Surface
{
[DescriptorSet(0), @Binding(0)]
public Texture2D Albedo;
[DescriptorSet(0), @Binding(1)]
public SamplerState Sampler;
}
using YotsubaShader.WgslSyntax;
using YotsubaShader.WgslSyntax.Resources;
public class Surface
{
[@group(0), @binding(0)]
public Texture2D Albedo;
[@group(0), @binding(1)]
public SamplerState Sampler;
}
Resource namespaces#
Resources belong to each syntax namespace, such as YotsubaShader.HlslSyntax.Resources or YotsubaShader.SpirvSyntax.Resources. Declarations are not proof of complete resource lowering. See the buffer tutorial for current constructors.
