77 lines
1.7 KiB
ReStructuredText
77 lines
1.7 KiB
ReStructuredText
#include "kernel.h"
|
|
|
|
ConstantBuffer<K_UiSig> sig : register(b0);
|
|
|
|
////////////////////////////////
|
|
//~ Shader types
|
|
|
|
//- Vertex shader in/out
|
|
Struct(VsInput)
|
|
{
|
|
Semantic(u32, SV_InstanceID);
|
|
Semantic(u32, SV_VertexID);
|
|
};
|
|
|
|
Struct(VSOutput)
|
|
{
|
|
nointerpolation Semantic(u32, tex_nurid);
|
|
Semantic(Vec2, uv);
|
|
Semantic(Vec4, tint_srgb);
|
|
Semantic(Vec4, SV_Position);
|
|
};
|
|
|
|
//- Pixel shader in/out
|
|
Struct(PsInput)
|
|
{
|
|
VSOutput vs;
|
|
};
|
|
|
|
Struct(PSOutput)
|
|
{
|
|
Semantic(Vec4, SV_Target0);
|
|
};
|
|
|
|
////////////////////////////////
|
|
//~ Vertex shader
|
|
|
|
K_ENTRY VSOutput vs(VsInput input)
|
|
{
|
|
static const Vec2 unit_quad_verts[4] = {
|
|
Vec2(-0.5f, -0.5f),
|
|
Vec2(0.5f, -0.5f),
|
|
Vec2(0.5f, 0.5f),
|
|
Vec2(-0.5f, 0.5f)
|
|
};
|
|
|
|
StructuredBuffer<K_UiInstance> instances = GpuResourceFromUrid(sig.instances_urid);
|
|
K_UiInstance instance = instances[input.SV_InstanceID];
|
|
Vec2 vert = unit_quad_verts[input.SV_VertexID];
|
|
Vec2 world_pos = mul(instance.xf, Vec3(vert, 1)).xy;
|
|
|
|
VSOutput output;
|
|
output.SV_Position = mul(sig.projection, Vec4(world_pos, 0, 1));
|
|
output.tex_nurid = instance.tex_nurid;
|
|
output.uv = instance.uv0 + ((vert + 0.5) * (instance.uv1 - instance.uv0));
|
|
output.tint_srgb = Vec4NormFromU32(instance.tint_srgb);
|
|
return output;
|
|
}
|
|
|
|
////////////////////////////////
|
|
//~ Pixel shader
|
|
|
|
K_ENTRY PSOutput ps(PsInput input)
|
|
{
|
|
PSOutput output;
|
|
Vec4 color = input.vs.tint_srgb;
|
|
|
|
/* Texture */
|
|
if (input.vs.tex_nurid < 0xFFFFFFFF)
|
|
{
|
|
Texture2D<Vec4> tex = GpuResourceFromNurid(input.vs.tex_nurid);
|
|
color *= tex.Sample(s_point_clamp, input.vs.uv);
|
|
}
|
|
|
|
output.SV_Target0 = color;
|
|
return output;
|
|
}
|