Yotsuba Shader
Español

Un shader. Cinco formas de escribirlo.

Los cinco proyectos de sintaxis declaran atributos C# inspirados en HLSL, GLSL, MSL, SPIR-V y WGSL. Sus conceptos están diseñados para compartir una ruta de salida; el pipeline completo del compilador sigue en desarrollo. Existen atributos de autoría WGSL, mientras que su salida está prevista para 2027.


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

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

public class Triangle
{
    [register(RegisterPrefix.u, 0)]
    public RWStructuredBuffer<float> Output;

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

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

    [ShaderStage(Stage.Compute)]
    [numthreads(8, 8, 1)]
    public void Compute([SV_DispatchThreadID] UInt3 id)
    {
    }
}

El mismo concepto, cinco formas de escribirlo

Triangle.cs
using YotsubaShader.Language;
using YotsubaShader.HlslSyntax;

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

public class BuiltIns
{
    [ShaderStage(Stage.Vertex)]
    public VertexOutput Vertex(
        // Índice de vértice
        [SV_VertexID] uint vertex,
        // Índice de instancia
        [SV_InstanceID] 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
        [SV_Position] Vector4 coord)
    {
        return new Vector4(coord.X, coord.Y, 0, 1);
    }

    [ShaderStage(Stage.Compute)]
    // Tamaño del workgroup (atributo de método)
    [numthreads(8, 8, 1)]
    public void Compute(
        // Id de invocación global
        [SV_DispatchThreadID] uint id)
    {
        uint index = id;
    }
}

Referencia completa de valores integrados