107 lines
2.9 KiB
HLSL
107 lines
2.9 KiB
HLSL
#include "shaders/common.hlsl"
|
|
|
|
struct vs_instance {
|
|
float2x3 xf;
|
|
float line_thickness;
|
|
float line_spacing;
|
|
float2 offset;
|
|
uint bg0_srgb;
|
|
uint bg1_srgb;
|
|
uint line_srgb;
|
|
uint x_srgb;
|
|
uint y_srgb;
|
|
};
|
|
|
|
struct ps_input {
|
|
DESV(float4, screen_pos, SV_POSITION);
|
|
DECL(float, line_thickness);
|
|
DECL(float, line_spacing);
|
|
DECL(float2, offset);
|
|
DECL(float4, bg0_lin);
|
|
DECL(float4, bg1_lin);
|
|
DECL(float4, line_lin);
|
|
DECL(float4, x_lin);
|
|
DECL(float4, y_lin);
|
|
};
|
|
|
|
/* ========================== *
|
|
* Globals
|
|
* ========================== */
|
|
|
|
StructuredBuffer<vs_instance> G_instance_buffer : register(t0);
|
|
|
|
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)
|
|
};
|
|
|
|
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 world_pos = mul(instance.xf, float3(vert, 1)).xy;
|
|
|
|
ps_input output;
|
|
output.screen_pos = mul(G_projection, float4(world_pos, 0, 1));
|
|
output.line_thickness = instance.line_thickness;
|
|
output.line_spacing = instance.line_spacing;
|
|
output.offset = instance.offset;
|
|
output.bg0_lin = linear_from_srgb32(instance.bg0_srgb);
|
|
output.bg1_lin = linear_from_srgb32(instance.bg1_srgb);
|
|
output.line_lin = linear_from_srgb32(instance.line_srgb);
|
|
output.x_lin = linear_from_srgb32(instance.x_srgb);
|
|
output.y_lin = linear_from_srgb32(instance.y_srgb);
|
|
|
|
return output;
|
|
}
|
|
|
|
/* ========================== *
|
|
* Pixel shader
|
|
* ========================== */
|
|
|
|
float4 ps_main(ps_input input) : SV_TARGET
|
|
{
|
|
float2 grid_pos = input.screen_pos.xy + input.offset;
|
|
float half_thickness = input.line_thickness / 2;
|
|
float spacing = input.line_spacing;
|
|
|
|
float4 color = input.bg0_lin;
|
|
|
|
float2 v = abs(round(grid_pos / spacing) * spacing - grid_pos);
|
|
float dist = min(v.x, v.y);
|
|
|
|
if (grid_pos.y <= half_thickness && grid_pos.y >= -half_thickness) {
|
|
color = input.x_lin;
|
|
} else if (grid_pos.x <= half_thickness && grid_pos.x >= -half_thickness) {
|
|
color = input.y_lin;
|
|
} else if (dist < half_thickness) {
|
|
color = input.line_lin;
|
|
} else {
|
|
bool checker = false;
|
|
uint cell_x = (uint)(abs(grid_pos.x) / spacing) + (grid_pos.x < 0);
|
|
uint cell_y = (uint)(abs(grid_pos.y) / spacing) + (grid_pos.y < 0);
|
|
if (cell_x % 2 == 0) {
|
|
checker = cell_y % 2 == 0;
|
|
} else {
|
|
checker = cell_y % 2 == 1;
|
|
}
|
|
if (checker) {
|
|
color = input.bg1_lin;
|
|
}
|
|
}
|
|
|
|
return color;
|
|
}
|