mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-23 17:30:42 +00:00
71 lines
1.7 KiB
GLSL
71 lines
1.7 KiB
GLSL
|
#version 450
|
||
|
#extension GL_GOOGLE_include_directive : enable
|
||
|
#extension GL_EXT_multiview : enable
|
||
|
|
||
|
#include "infplane.finc"
|
||
|
|
||
|
layout (set = 0, binding = 0) uniform
|
||
|
#include "matrices.h"
|
||
|
;
|
||
|
|
||
|
struct PlaneData {
|
||
|
mat3x4 p;
|
||
|
vec4 scolor;
|
||
|
vec4 tcolor;
|
||
|
};
|
||
|
|
||
|
layout (set = 1, binding = 0) buffer Planes {
|
||
|
int numPlanes;
|
||
|
PlaneData planes[];
|
||
|
};
|
||
|
|
||
|
layout (location = 0) in vec2 uv;
|
||
|
layout (location = 0) out vec4 frag_color;
|
||
|
|
||
|
const float N = 128.0; // grid ratio
|
||
|
vec3 gridTextureGradBox( in vec2 p, in vec2 ddx, in vec2 ddy )
|
||
|
{
|
||
|
// filter kernel
|
||
|
vec2 w = max(abs(ddx), abs(ddy)) + 0.01;
|
||
|
|
||
|
// analytic (box) filtering
|
||
|
vec2 a = p + 0.5*w + vec2(0.5/N);
|
||
|
vec2 b = p - 0.5*w + vec2(0.5/N);
|
||
|
vec2 i = (floor(a)+min(fract(a)*N,1.0)-
|
||
|
floor(b)-min(fract(b)*N,1.0))/(N*w);
|
||
|
//pattern
|
||
|
return vec3(1 - (1.0-i.x)*(1.0-i.y), i.x, i.y);
|
||
|
}
|
||
|
|
||
|
|
||
|
void
|
||
|
main (void)
|
||
|
{
|
||
|
mat4 p = inverse (View[gl_ViewIndex]);
|
||
|
mat3 cam = mat3(vec3(p[0]) / Projection3d[0][0],
|
||
|
vec3(p[1]) / Projection3d[1][1],
|
||
|
vec3(p[2]));
|
||
|
vec4 c = vec4(0);
|
||
|
vec2 UV = 2 * uv - vec2(1,1);
|
||
|
for (int i = 0; i < numPlanes; i++) {
|
||
|
vec4 pst = plane_st (mat3(planes[i].p), cam, vec3(UV, 1));
|
||
|
vec2 st = pst.xy;
|
||
|
vec2 ddx_st = dFdx (st);
|
||
|
vec2 ddy_st = dFdy (st);
|
||
|
bool d = pst.w * planes[i].p[0][3] > 0;
|
||
|
if (!d) continue;
|
||
|
vec3 g = gridTextureGradBox(st, ddx_st, ddy_st);
|
||
|
float c1 = abs(st.y) < 0.5 ? g[2] : 0;
|
||
|
float c2 = abs(st.x) < 0.5 ? g[1] : 0;
|
||
|
float c0 = g[0] * (1 - c1) * (1 - c2);
|
||
|
c += vec4(1) * c0 + planes[i].scolor * c1 + planes[i].tcolor * c2;
|
||
|
//st = fract(st);
|
||
|
//st = st - st * st;
|
||
|
//float s = st.x * st.y;
|
||
|
//s = 20 * (0.05 - s);
|
||
|
//s = max (s, 0);
|
||
|
//c += pst.w * planes[i][0][3] > 0 ? s * vec4(1,1,1,0.4): vec4(0);
|
||
|
}
|
||
|
frag_color = c;
|
||
|
}
|