#include "shaders_dx11/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 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; }