74 lines
1.6 KiB
HLSL
74 lines
1.6 KiB
HLSL
#include "shaders/common.hlsl"
|
|
|
|
struct vs_instance {
|
|
float2x3 xf;
|
|
float2 uv0;
|
|
float2 uv1;
|
|
uint tint_srgb;
|
|
};
|
|
|
|
struct ps_input {
|
|
DESV(float4, screen_pos, SV_POSITION);
|
|
DECL(float2, uv);
|
|
DECL(float4, tint_lin);
|
|
};
|
|
|
|
/* ========================== *
|
|
* Globals
|
|
* ========================== */
|
|
|
|
SamplerState G_sampler : register(s0);
|
|
|
|
Texture2D G_Texture : register(t0);
|
|
|
|
StructuredBuffer<vs_instance> G_instance_buffer : register(t1);
|
|
|
|
cbuffer constants : register(b0)
|
|
{
|
|
float4x4 G_projection;
|
|
uint G_instance_offset;
|
|
};
|
|
|
|
/* ========================== *
|
|
* Vertex shader
|
|
* ========================== */
|
|
|
|
static const float2 G_quad_verts[4] = {
|
|
float2(-0.5f, -0.5f),
|
|
float2( 0.5f, -0.5f),
|
|
float2( 0.5f, 0.5f),
|
|
float2(-0.5f, 0.5f)
|
|
};
|
|
|
|
static const int2 G_uv_factors[4] = {
|
|
int2(0, 0),
|
|
int2(1, 0),
|
|
int2(1, 1),
|
|
int2(0, 1)
|
|
};
|
|
|
|
ps_input vs_main(uint instance_id : SV_InstanceID, uint vertex_id : SV_VertexID)
|
|
{
|
|
vs_instance instance = G_instance_buffer[G_instance_offset + instance_id];
|
|
float2 vert = G_quad_verts[vertex_id];
|
|
float2 uv_factor = G_uv_factors[vertex_id];
|
|
float2 world_pos = mul(instance.xf, float3(vert, 1)).xy;
|
|
|
|
ps_input output;
|
|
output.screen_pos = mul(G_projection, float4(world_pos, 0, 1));
|
|
output.uv = instance.uv0 + uv_factor * (instance.uv1 - instance.uv0);
|
|
output.tint_lin = linear_from_srgb32(instance.tint_srgb);
|
|
|
|
return output;
|
|
}
|
|
|
|
/* ========================== *
|
|
* Pixel shader
|
|
* ========================== */
|
|
|
|
float4 ps_main(ps_input input) : SV_TARGET
|
|
{
|
|
float4 color = G_Texture.Sample(G_sampler, input.uv) * input.tint_lin;
|
|
return color;
|
|
}
|