Yotsuba Shader
Documentación

Artículo

Entender Yotsuba Shader

Descubre cómo una clase de C# se convierte en un shader: el lenguaje, la representación intermedia y el compilador.

Resumen#

Yotsuba Shader es la capa de escritura de shaders para tu motor, framework o herramienta de contenido. Tu equipo escribe shaders en C# con tipos, estructuras y atributos. El compilador interpreta sus interfaces y etapas, las baja a una representación intermedia compartida y genera la salida para el backend seleccionado.

La idea central es sencilla: la sintaxis con la que escribes no determina el destino de salida. HLSL, GLSL, MSL, SPIR-V y WGSL ofrecen vocabularios de escritura equivalentes. Elige el que mejor conozca tu equipo y después selecciona SPIR-V u otro backend al compilar.

Pipeline
C# with familiar attributes
          ↓
semantic analysis and validation
          ↓
Yotsuba IR
          ↓
SPIR-V · future backends

Las tres capas#

Yotsuba Shader se organiza en torno a tres ideas que corresponden a proyectos separados:

  • Lenguaje (YotsubaShader.Language): los atributos y tipos nativos con los que escribes. Consulta Etapas de shader.
  • Representación intermedia (YotsubaShader.IR): modelo interno de funciones, almacenamiento y slots de interfaz. Consulta el Proceso de compilación.
  • Compilador (YotsubaShader.Roslyn, YotsubaShader.Compiler.SpirV): descubrimiento, análisis y emisión SPIR-V. Consulta Pipeline de compilación.

Un shader de un vistazo#

BasicColorShader.cs
using Microsoft.Xna.Framework;
using YotsubaShader.Language;
using YotsubaShader.HlslSyntax;

public class BasicColorShader
{
    public struct VS_Input
    {
        [POSITION]
        public Vector2 Position;

        [COLOR]
        public Vector4 Color;
    }

    public struct VS_Output
    {
        [SV_Position]
        public Vector4 Position;

        [COLOR]
        public Vector4 Color;
    }

    [ShaderStage(Stage.Vertex)]
    public VS_Output VS(VS_Input input)
    {
        VS_Output output = new VS_Output();

        output.Position = new Vector4(
            input.Position.X,
            input.Position.Y,
            0.0f,
            1.0f
        );

        output.Color = input.Color;

        return output;
    }

    [ShaderStage(Stage.Fragment)]
    [return: SV_Target(0)]
    public Vector4 FS(VS_Output input)
    {
        return input.Color;
    }
}

El ejemplo utiliza las semánticas HLSL [POSITION] y [COLOR], además del built-in [SV_Position]. Los atributos numerados [Location(n)] pertenecen al namespace separado de sintaxis SPIR-V.

¿Por qué atributos?#

Los atributos hacen explícita la interfaz: entradas, salidas, recursos, ubicaciones, bindings y etapas se declaran siempre, nunca se deducen por convenciones de nombres. Eso permite que el compilador valide un shader antes de que intervenga ninguna GPU.

Copyright © 2026 Colaboradores de Yotsuba Shader · Licencias · GitHub