Yotsuba Shader
Español

Sintaxis SPIR-V

Equipos que piensan en SPIR-V y en descriptores de Vulkan. Inspirada en SPIR-V (Vulkan).

Paquete y namespace YotsubaShader.SpirvSyntax · 34 atributos


Por qué elegirlo

Los nombres reflejan las decoraciones BuiltIn de SPIR-V (BuiltIn_Position, BuiltIn_GlobalInvocationId), así que la correspondencia con el binario es la más literal de los cinco.

Los recursos usan Uniform, StorageBuffer, DescriptorSet(s) y Binding(n).

El mismo shader

Triangle.cs
using YotsubaShader.Language;
using YotsubaShader.SpirvSyntax;
using YotsubaShader.SpirvSyntax.Resources;

public struct VertexOutput
{
    [BuiltIn_Position]
    public Vector4 Position;
}

public class Triangle
{
    [StorageBuffer, DescriptorSet(0), @Binding(0)]
    public float[] Output;

    [ShaderStage(Stage.Vertex)]
    public VertexOutput Vertex([BuiltIn_VertexIndex] uint id)
    {
        VertexOutput output = new VertexOutput();
        output.Position = new Vector4(0, 0, 0, 1);
        return output;
    }

    [ShaderStage(Stage.Fragment)]
    public Vector4 Fragment(VertexOutput input)
    {
        return new Vector4(1, 0.4f, 0.7f, 1);
    }

    // El tamaño del workgroup lo define el host
    [ShaderStage(Stage.Compute)]
    public void Compute([BuiltIn_GlobalInvocationId] UInt3 id)
    {
    }
}

Valores integrados comunes

BuiltIns.cs
using YotsubaShader.Language;
using YotsubaShader.SpirvSyntax;

public struct VertexOutput
{
    // Posición en clip space (salida de vertex)
    [BuiltIn_Position]
    public Vector4 Position;
}

public class BuiltIns
{
    [ShaderStage(Stage.Vertex)]
    public VertexOutput Vertex(
        // Índice de vértice
        [BuiltIn_VertexIndex] uint vertex,
        // Índice de instancia
        [BuiltIn_InstanceIndex] uint instance)
    {
        VertexOutput output = new VertexOutput();
        output.Position = new Vector4(vertex, instance, 0, 1);
        return output;
    }

    [ShaderStage(Stage.Fragment)]
    public Vector4 Fragment(
        // Coordenada de fragmento
        [BuiltIn_FragCoord] Vector4 coord)
    {
        return new Vector4(coord.X, coord.Y, 0, 1);
    }

    [ShaderStage(Stage.Compute)]
    // Sin atributo de método: el tamaño del workgroup es un valor integrado
    public void Compute(
        // Id de invocación global
        [BuiltIn_GlobalInvocationId] uint id)
    {
        uint index = id;
    }
}

Recursos

Resources.cs
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;
}

Todos los atributos de la sintaxis SPIR-V

Otras sintaxis: sintaxis HLSL · sintaxis GLSL · sintaxis MSL · sintaxis WGSL