Mikulas Florek 2023-10-20 14:41:54 +02:00
parent a95bde4687
commit 48a4ada4f9
2 changed files with 63 additions and 0 deletions

52
data/pipelines/grid.shd Normal file
View File

@ -0,0 +1,52 @@
include "pipelines/common.glsl"
------------------
vertex_shader [[
layout(std140, binding = 4) uniform Model {
mat4 u_model;
};
out vec4 v_lpos;
void main() {
vec3 local_pos = vec3(gl_VertexID & 1, 0, gl_VertexID >> 1) * 1000 - 500;
local_pos.y = 0;
v_lpos = vec4(local_pos, 1);
vec4 p = vec4(local_pos - Global.camera_world_pos.xyz, 1);
gl_Position = Global.projection_no_jitter * Global.view * p;
}
]]
---------------------
fragment_shader [[
layout(location = 0) out vec4 o_color;
// https://bgolus.medium.com/the-best-darn-grid-shader-yet-727f9278b9d8
// https://gist.github.com/bgolus/d49651f52b1dcf82f70421ba922ed064
float PristineGrid(vec2 uv, vec2 lineWidth) {
vec4 uvDDXY = vec4(dFdx(uv), dFdy(uv));
vec2 uvDeriv = vec2(length(uvDDXY.xz), length(uvDDXY.yw));
bvec2 invertLine = lessThan(lineWidth, vec2(0.5));
vec2 targetWidth = mix(1.0 - lineWidth, lineWidth, invertLine);
vec2 drawWidth = clamp(targetWidth, uvDeriv, vec2(0.5));
vec2 lineAA = uvDeriv * 1.5;
vec2 gridUV = abs(fract(uv) * 2.0 - 1.0);
gridUV = mix(gridUV, 1.0 - gridUV, invertLine);
vec2 grid2 = smoothstep(drawWidth + lineAA, drawWidth - lineAA, gridUV);
grid2 *= saturate(targetWidth / drawWidth);
grid2 = mix(grid2, targetWidth, saturate(uvDeriv * 2.0 - 1.0));
grid2 = mix(1.0 - grid2, grid2, invertLine);
return mix(grid2.x, 1.0, grid2.y);
}
in vec4 v_lpos;
void main() {
vec2 uv = v_lpos.xz / v_lpos.w;
float grid = PristineGrid(uv, vec2(0.005));
if (grid < 0.0) discard;
o_color = vec4(vec3(0.0), grid);
}
]]

View File

@ -7,6 +7,7 @@ local cubemap_sky = require "pipelines/cubemap_sky"
local film_grain = require "pipelines/film_grain"
local fxaa = require "pipelines/fxaa"
local grid_shader = preloadShader("pipelines/grid.shd")
local lighting_shader = preloadShader("pipelines/lighting.shd")
local field_debug_shader = preloadShader("pipelines/field_debug.shd")
textured_quad_shader = preloadShader("pipelines/textured_quad.shd")
@ -31,6 +32,7 @@ local taa_history = -1
local render_grass = true
local render_impostors = true
local render_terrain = true
local enable_grid = true
type GBuffer = {
A : RenderBuffer,
@ -319,6 +321,12 @@ blur = function(buffer: RenderBuffer, w : number, h : number, rb_desc : RenderBu
setRenderTargets()
end
local function grid()
if enable_grid then
drawArray(0, 4, grid_shader, {}, transparent_state);
end
end
local function shadowPass() : RenderBuffer
if not environmentCastShadows() then
local rb = createRenderbuffer(shadowmap_1x1)
@ -572,6 +580,8 @@ main = function()
if SCENE_VIEW ~= nil then
local icon_ds = createRenderbuffer(icon_ds_desc)
pass(view_params)
setRenderTargetsDS(res, gbuffer.DS)
grid()
setRenderTargetsDS(res, icon_ds)
clear(CLEAR_DEPTH, 0, 0, 0, 1, 0)
renderGizmos()
@ -659,6 +669,7 @@ onGUI = function()
_, render_impostors = ImGui.Checkbox("Impostors", render_impostors)
_, render_terrain = ImGui.Checkbox("Terrain", render_terrain)
_, enable_icons = ImGui.Checkbox("Icons", enable_icons)
_, enable_grid = ImGui.Checkbox("Grid", enable_grid)
local changed, upsample = ImGui.DragFloat("Downsample", getRenderToDisplayRatio())
if changed then
if upsample < 1 then upsample = 1 end