From 6922b3ef322b2bc704d615889601596aa41d6b87 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Wed, 15 Jul 2020 19:18:28 +0800 Subject: [PATCH] add EndlessGrid.frag --- shader/EndlessGrid.frag | 65 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 shader/EndlessGrid.frag diff --git a/shader/EndlessGrid.frag b/shader/EndlessGrid.frag new file mode 100644 index 0000000..48e9201 --- /dev/null +++ b/shader/EndlessGrid.frag @@ -0,0 +1,65 @@ +#version 450 core + +layout(location=0) out vec4 FragColor; + +layout(binding=1) uniform ColorMaterial +{ + vec4 color; +} color_material; + +layout(binding=10) uniform WorldMatrix // hgl/math/Math.h +{ + mat4 ortho; + + mat4 projection; + mat4 inverse_projection; + + mat4 modelview; + mat4 inverse_modelview; + + mat4 mvp; + mat4 inverse_mvp; + + vec4 view_pos; + vec2 canvas_resolution; + vec2 viewport_resolution; +}fs_world; + +const float TAU = 2.* 3.1415926535897932384626433832795; +const float grid4 = 2097152.0,grid3 = 131072.0,grid2 = 1024.0,grid1 = 64.0; + +float grid(vec2 f, vec3 pos, float rdy, float t) { + float ff = min(fs_world.canvas_resolution.x,fs_world.canvas_resolution.y)/1024.0; + vec4 distances = (abs(pos.xz)* TAU).xxyy; + float referenceBase = log(20.*ff/ (t* pow(abs(rdy),.8)))/ log(10.); + float nearestBase = floor(referenceBase); + float partialBase = fract(referenceBase); + const vec4 gain = vec4(grid4- grid3,grid1,grid3- grid2,grid2- grid1); + const vec4 off = vec4(grid3,0,grid2,grid1); + vec4 exponentialBase = partialBase* partialBase* gain+ off; + vec4 bases = pow(vec4(10),nearestBase+ vec4(-2,1,-1,0)); + vec4 lx = pow(.5+ .5* cos(distances* bases.xyxy),exponentialBase.xyxy); + vec4 ly = pow(.5+ .5* cos(distances* bases.zwzw),exponentialBase.zwzw); + vec4 l4 = (1.- lx* vec4(1.- partialBase,partialBase,1.- partialBase,partialBase))* (1.- ly); + vec2 l2 = l4.xy* l4.zw; + float l1 = .30078125* (1.- l2.x* l2.y); + return l1; +} + +float EndlessGird(vec2 f) +{ + float rcpResY = 1./ fs_world.canvas_resolution.y; + vec2 uv = 2.0* rcpResY* f- vec2(fs_world.canvas_resolution.x* rcpResY,1); + vec3 ro = vec3(0,1.0,0); + vec3 rd = normalize(vec3(uv.x,-1,uv.y)); + float t = 1.0/ -rd.y; + vec3 pos = ro + t* rd; + return grid(f,pos,rd.y,t); +} + +void main() +{ + float strong=EndlessGird(gl_FragCoord.xy); + + FragColor=vec4(color_material.color.rgb*strong,1.0); +}