Yotsuba Shader
Español

Escribe Shaders en C#.

Yotsuba Shader es un framework de shaders y un compilador para C#. Escribe shaders con los tipos de tu propio proyecto y las bibliotecas que ya usas, y compila para Spirv y otros formatos con Yotsuba ShaderCross.


Escribe los shaders una vez. Compila para cualquier backend.

Escribe con el vocabulario que tu equipo conoce. Un frontend basado en Roslyn y una representación intermedia compartida lo convierten al formato de shader que espera cada API gráfica, como SPIR-V para Vulkan.

ETAPAS DE SHADER

El pipeline de hoy. Las etapas que vienen después.

Vertex, Fragment y Compute están declarados en la API actual; su compilación completa está en desarrollo. Geometry, Hull y Domain están previstos para marzo de 2027.

Ahora

Vertex, Fragment, Compute

Las declaraciones de autoría existen actualmente. La compilación GPU completa sigue en desarrollo.

A triangle being rasterized into a grid of pixels
Diagrama de rasterización de Wojciech Mula, vía Wikimedia Commons · Dominio público

Marzo de 2027

Geometry, Hull, Domain

Soporte planificado para procesamiento de geometría y teselación en la GPU.

A tessellation pipeline turning a cube into a smooth shaded sphere
Diagrama de teselación de Romainbehar y Mark Viking, vía Wikimedia Commons · CC BY-SA 3.0

Octubre de 2027

4. Pipeline de ray tracing

Soporte planificado para los stages programables que hacen extensible el ray tracing.

  • Ray Generation
  • Intersection
  • Any-Hit
  • Closest-Hit
  • Miss
  • Callable
Rays traveling from a camera to a scene object and a light source
Diagrama de ray tracing de Henrik, vía Wikimedia Commons · CC BY-SA 4.0

SPONSORS

Los sponsors ayudan a decidir qué viene después.

Yotsuba Shader es gratis para todos. El patrocinio paga el tiempo que lo mantiene vivo y te da voz sobre cómo se usa ese tiempo.

Patrocinar nunca desbloquea funciones ni cambia la licencia. Todos reciben el mismo código.

Etapas de vertex, fragment y compute, descritas en C# normal. Los tipos de vectores, matrices y texturas de tu proyecto se convierten en tipos nativos de la GPU, y tus shaders pueden apoyarse en bibliotecas externas: no hay un segundo lenguaje que aprender ni tipos duplicados. Si sabes escribir C#, sabes escribir shaders.

Un shader. Cinco formas de escribirlo.

Cinco vocabularios de atributos describen conceptos de shaders en C#. Comparten una ruta de salida prevista; la conversión completa está en desarrollo y la salida WGSL sigue planificada.

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)
    {
    }
}

Elegir una sintaxis

Diagnósticos de shaders: previstos

El playground ofrece actualmente diagnósticos C# y descubrimiento de shaders. Los diagnósticos de shaders en el IDE y el análisis de compatibilidad por backend están previstos.

Consulta el estado actual de validación

Integración con el build: en desarrollo

El generador existente construye la tabla de instrucciones SPIR-V. Están previstos un generador que compile tus shaders y una CLI de compilación de shaders.

Explora la generación binaria actual

Cada interfaz declarada. Validada antes de llegar a la GPU.

Entradas, salidas, recursos, ubicaciones, bindings y etapas se escriben con atributos, nunca se deducen por convenciones de nombres. Eso permite que el compilador revise un shader mucho antes de que lo vea cualquier controlador.

  • Ubicaciones y valores integrados en cada frontera entre etapas
  • Uniforms, storage buffers, texturas y samplers con bindings explícitos
  • Puntos de entrada de vertex, fragment y compute en una sola clase de C#

Slots de interfaz y ubicaciones

Interfaces.cs
using Microsoft.Xna.Framework;
using YotsubaShader.HlslSyntax;
using YotsubaShader.HlslSyntax.Resources;

public struct VertexOutput
{
    [SV_Position]
    public Vector4 Position;  // valor integrado

    [COLOR]
    public Vector4 Color;     // pasa a fragment
}

public sealed class Material
{
    [cbuffer, register(RegisterPrefix.b, 0)]
    public float Exposure;
}

Usa tus propios tipos. Trae tus propias bibliotecas.

Tus shaders forman parte de tu proyecto de C#, así que comparten sus tipos. Marca con un atributo los vectores, matrices y texturas que ya tienes y se convierten en tipos nativos de la GPU, sin un conjunto paralelo de structs solo para shaders que mantener sincronizado.

  • Asigna los tipos de CPU de tu proyecto a tipos nativos de la GPU con atributos
  • Crea shaders sobre bibliotecas externas y paquetes de NuGet
  • Un solo código para CPU y GPU: los mismos tipos en ambos lados

Reutilizar tus tipos y bibliotecas

Types.cs
// Tu propio tipo, como vector de la GPU
[Vector]
public struct Vector3
{
    [VectorComponent(0)] public float X;
    [VectorComponent(1)] public float Y;
    [VectorComponent(2)] public float Z;
}

// ...y usado directamente por un shader
[ShaderStage(Stage.Vertex)]
public VertexOutput Vertex(
    Vector3 position) { /* ... */ }

¿Listo para escribir tu primer shader?

Compila el repositorio, lee la guía y descubre cómo una clase de C# se convierte en una etapa de shader.