Sintaxis WGSL
Equipos que vienen de WebGPU y WGSL. Inspirado en WGSL (WebGPU).
Por qué elegirlo
El vocabulario @builtin(...), @group y @binding. En C# los nombres llevan una @ en el identificador, como en [@builtin_position], y siguen siendo C# válido.
El tamaño del workgroup es [@workgroup_size(x, y = 1, z = 1)]. El acceso a storage usa storage(storage_use.read) o storage_use.read_write.
El mismo shader
using YotsubaShader.Language;
using YotsubaShader.WgslSyntax;
using YotsubaShader.WgslSyntax.Resources;
public struct VertexOutput
{
[@builtin_position]
public Vector4 Position;
}
public class Triangle
{
[storage(storage_use.read_write), @group(0), @binding(0)]
public float[] Output;
[ShaderStage(Stage.Vertex)]
public VertexOutput Vertex([@builtin_vertex_index] uint id)
{
VertexOutput output = new VertexOutput();
output.Position = new Vector4(0, 0, 0, 1);
return output;
}
[ShaderStage(Stage.Fragment)]
public Vector4 Fragment(VertexOutput input)
{
return new Vector4(1, 0.4f, 0.7f, 1);
}
[ShaderStage(Stage.Compute)]
[@workgroup_size(8, 8, 1)]
public void Compute([@builtin_global_invocation_id] UInt3 id)
{
}
}
Valores integrados comunes
using YotsubaShader.Language;
using YotsubaShader.WgslSyntax;
public struct VertexOutput
{
// Posición en clip space (salida de vertex)
[@builtin_position]
public Vector4 Position;
}
public class BuiltIns
{
[ShaderStage(Stage.Vertex)]
public VertexOutput Vertex(
// Índice de vértice
[@builtin_vertex_index] uint vertex,
// Índice de instancia
[@builtin_instance_index] 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
[@builtin_position] Vector4 coord)
{
return new Vector4(coord.X, coord.Y, 0, 1);
}
[ShaderStage(Stage.Compute)]
// Tamaño del workgroup (atributo de método)
[@workgroup_size(8, 8, 1)]
public void Compute(
// Id de invocación global
[@builtin_global_invocation_id] uint id)
{
uint index = id;
}
}
Recursos
using YotsubaShader.Language;
using YotsubaShader.WgslSyntax;
using YotsubaShader.WgslSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[uniform, @group(0), @binding(0)]
public Material Material;
// Storage buffer de lectura y escritura
[storage(storage_use.read_write), @group(0), @binding(1)]
public float[] Output;
// Storage buffer de solo lectura
[storage(storage_use.read), @group(0), @binding(2)]
public float[] Input;
}
Todos los atributos de la sintaxis WGSL
Otras sintaxis: sintaxis HLSL · sintaxis GLSL · sintaxis MSL · sintaxis SPIR-V
