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.
C# with familiar attributes
↓
semantic analysis and validation
↓
Yotsuba IR
↓
SPIR-V · future backendsLas 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#
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.
