#include "sh/common.hlsl" /* ========================== * * Root signature * ========================== */ #define ROOTSIG \ "CBV(b0), " \ "SRV(t0), " \ "DescriptorTable(SRV(t1, numDescriptors = unbounded, flags = DESCRIPTORS_VOLATILE)), " \ "StaticSampler(s0, " \ "filter = FILTER_MIN_MAG_MIP_POINT, " \ "addressU = TEXTURE_ADDRESS_CLAMP, " \ "addressV = TEXTURE_ADDRESS_CLAMP, " \ "addressW = TEXTURE_ADDRESS_CLAMP, " \ "maxAnisotropy = 1)" cbuffer cb : register(b0) { struct sh_material_constants g_constants; }; StructuredBuffer g_instances : register(t0); Texture2D g_textures[] : register(t1); SamplerState g_sampler : register(s0); /* ========================== * * Vertex shader * ========================== */ struct vs_input { DECL(uint, SV_InstanceID); DECL(uint, SV_VertexID); }; struct vs_output { DECL(float4, SV_Position); DECL(float2, uv); DECL(float4, tint_lin); DECL(uint, texture_nuri); }; SH_ENTRY(ROOTSIG) struct vs_output vs(struct vs_input input) { static const float2 unit_quad_verts[4] = { float2(-0.5f, -0.5f), float2(0.5f, -0.5f), float2(0.5f, 0.5f), float2(-0.5f, 0.5f) }; struct sh_material_instance instance = g_instances[g_constants.instance_offset + input.SV_InstanceID]; float2 vert = unit_quad_verts[input.SV_VertexID]; float2 world_pos = mul(instance.xf, float3(vert, 1)).xy; struct vs_output output; output.SV_Position = mul(g_constants.projection, float4(world_pos, 0, 1)); output.uv = instance.uv0 + ((vert + 0.5) * (instance.uv1 - instance.uv0)); output.tint_lin = linear_from_srgb32(instance.tint_srgb); output.texture_nuri = instance.texture_nuri; return output; } /* ========================== * * Pixel shader * ========================== */ struct ps_input { struct vs_output vs; }; struct ps_output { DECL(float4, SV_Target); }; SH_ENTRY(ROOTSIG) struct ps_output ps(struct ps_input input) { struct ps_output output; output.SV_Target = g_textures[NURI(input.vs.texture_nuri)].Sample(g_sampler, input.vs.uv) * input.vs.tint_lin; return output; }