Sintaxis HLSL
Equipos que vienen de Direct3D y HLSL. Inspirado en HLSL (Direct3D).
Por qué elegirlo
Las semánticas de valores del sistema (SV_Position, SV_VertexID, SV_DispatchThreadID) se leen con claridad, y la relación entre etapas, entradas, posición y color del fragmento es fácil de ver. Es una buena primera opción si empiezas de cero.
El tamaño del workgroup de cómputo es un atributo de método: [numthreads(x, y, z)]. Los recursos usan cbuffer y register(RegisterPrefix.b, n).
El mismo shader
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)
{
}
}
Valores integrados comunes
using YotsubaShader.Language;
using YotsubaShader.HlslSyntax;
public struct VertexOutput
{
// Posición en clip space (salida de vertex)
[SV_Position]
public Vector4 Position;
}
public class BuiltIns
{
[ShaderStage(Stage.Vertex)]
public VertexOutput Vertex(
// Índice de vértice
[SV_VertexID] uint vertex,
// Índice de instancia
[SV_InstanceID] 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
[SV_Position] Vector4 coord)
{
return new Vector4(coord.X, coord.Y, 0, 1);
}
[ShaderStage(Stage.Compute)]
// Tamaño del workgroup (atributo de método)
[numthreads(8, 8, 1)]
public void Compute(
// Id de invocación global
[SV_DispatchThreadID] uint id)
{
uint index = id;
}
}
Recursos
using YotsubaShader.Language;
using YotsubaShader.HlslSyntax;
using YotsubaShader.HlslSyntax.Resources;
public struct Material
{
public float Exposure;
}
public class Resources
{
// Uniform buffer, con su slot de binding
[cbuffer, register(RegisterPrefix.b, 0)]
public Material Material;
// Storage buffer de lectura y escritura
[register(RegisterPrefix.u, 0)]
public RWStructuredBuffer<float> Output;
// Storage buffer de solo lectura
[register("t0")]
public StructuredBuffer<float> Input;
}
Todos los atributos de la sintaxis HLSL
Otras sintaxis: sintaxis GLSL · sintaxis MSL · sintaxis SPIR-V · sintaxis WGSL
