Yotsuba Shader
Español

Tu primer shader

Un shader de color en C#: la etapa de vertex recibe una posición y un color por vértice, pasa el color y la etapa de fragment lo devuelve.


La sintaxis HLSL es un buen punto de partida porque la relación entre etapas, entradas, posición y color del fragmento se ve con facilidad.

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;
    }
}

Qué hace cada pieza

  • VertexInput define los datos que entrega el motor.
  • [POSITION] y [COLOR] identifican las entradas vertex.
  • VertexOutput define lo que el shader de vertex pasa a la siguiente etapa.
  • [SV_Position] marca la posición que exige la GPU.
  • [ShaderStage] identifica las etapas de vertex y fragment.
  • [COLOR] transmite el color entre etapas; [return: SV_Target(0)] identifica la salida de color fragment.

Qué ve el compilador

El compilador empieza por encontrar BasicColorShader, porque dos de sus métodos llevan [ShaderStage]. De cada uno lee qué etapa es, qué recibe y qué devuelve.

Los atributos describen semánticas de usuario y built-ins. [Location(n)] está disponible por separado en YotsubaShader.SpirvSyntax. Las declaraciones de sintaxis abarcan más conceptos de los que puede convertir el procesador actual.

Hazlo crecer

Los recursos utilizan el namespace de la sintaxis elegida, por ejemplo YotsubaShader.SpirvSyntax.Resources. Existen declaraciones compute, mientras la compilación completa de cuerpos de shaders sigue incompleta.

Leer el artículo completo