Sintaxis SPIR-V
Equipos que piensan en SPIR-V y en descriptores de Vulkan. Inspirada en SPIR-V (Vulkan).
Por qué elegirlo
Los nombres reflejan las decoraciones BuiltIn de SPIR-V (BuiltIn_Position, BuiltIn_GlobalInvocationId), así que la correspondencia con el binario es la más literal de los cinco.
Los recursos usan Uniform, StorageBuffer, DescriptorSet(s) y Binding(n).
El mismo shader
using YotsubaShader.Language;
using YotsubaShader.SpirvSyntax;
using YotsubaShader.SpirvSyntax.Resources;
public struct VertexOutput
{
[BuiltIn_Position]
public Vector4 Position;
}
public class Triangle
{
[StorageBuffer, DescriptorSet(0), @Binding(0)]
public float[] Output;
[ShaderStage(Stage.Vertex)]
public VertexOutput Vertex([BuiltIn_VertexIndex] 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);
}
// El tamaño del workgroup lo define el host
[ShaderStage(Stage.Compute)]
public void Compute([BuiltIn_GlobalInvocationId] UInt3 id)
{
}
}
Valores integrados comunes
using YotsubaShader.Language;
using YotsubaShader.SpirvSyntax;
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_VertexIndex] uint vertex,
// Índice de instancia
[BuiltIn_InstanceIndex] 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_FragCoord] Vector4 coord)
{
return new Vector4(coord.X, coord.Y, 0, 1);
}
[ShaderStage(Stage.Compute)]
// Sin atributo de método: el tamaño del workgroup es un valor integrado
public void Compute(
// Id de invocación global
[BuiltIn_GlobalInvocationId] uint id)
{
uint index = id;
}
}
Recursos
using YotsubaShader.Language;
using YotsubaShader.SpirvSyntax;
using YotsubaShader.SpirvSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[Uniform, DescriptorSet(0), @Binding(0)]
public Material Material;
// Storage buffer de lectura y escritura
[StorageBuffer, DescriptorSet(0), @Binding(1)]
public float[] Output;
// Storage buffer de solo lectura (el mismo atributo)
[StorageBuffer, DescriptorSet(0), @Binding(2)]
public float[] Input;
}
Todos los atributos de la sintaxis SPIR-V
Otras sintaxis: sintaxis HLSL · sintaxis GLSL · sintaxis MSL · sintaxis WGSL
