quakeforge/libs/video/renderer/vulkan/shader/bsp_turb.frag
Bill Currie 8c5c39cbe4 [vulkan] Mix turb full-brights into main color
I'd forgotten (when doing the original brush texture loader) that
turbulent surfaces were unlit and thus always full-bright, then never
wrote the turb shader to take care of it. The best solution seems to be
to just mix the two colors in the shader as it will allow turb surfaces
to be lit in the future (probably with severely limited light counts due
to being a forward renderer).
2021-12-24 06:45:13 +09:00

56 lines
1.4 KiB
GLSL

#version 450
layout (constant_id = 0) const int MaxTextures = 256;
layout (set = 1, binding = 0) uniform sampler samp;
layout (set = 1, binding = 1) uniform texture2DArray textures[MaxTextures];
layout (push_constant) uniform PushConstants {
layout (offset = 64)
vec4 fog;
float time;
int texind;
};
layout (location = 0) in vec4 tl_st;
layout (location = 1) in vec3 direction;
layout (location = 0) out vec4 frag_color;
const float PI = 3.14159265;
const float SPEED = 20.0;
const float CYCLE = 128.0;
const float FACTOR = PI * 2.0 / CYCLE;
const vec2 BIAS = vec2 (1.0, 1.0);
const float SCALE = 8.0;
vec2
warp_st (vec2 st, float time)
{
vec2 angle = st.ts * CYCLE / 2.0;
vec2 phase = vec2 (time, time) * SPEED;
return st + (sin ((angle + phase) * FACTOR) + BIAS) / SCALE;
}
vec4
fogBlend (vec4 color)
{
float az = fog.a * gl_FragCoord.z / gl_FragCoord.w;
vec3 fog_color = fog.rgb;
float fog_factor = exp (-az * az);
return vec4 (mix (fog_color.rgb, color.rgb, fog_factor), color.a);
}
void
main (void)
{
vec4 c = vec4 (0);
vec4 e;
vec3 t_st = vec3 (warp_st (tl_st.xy, time), 0);
vec3 e_st = vec3 (warp_st (tl_st.xy, time), 1);
c = texture (sampler2DArray (textures[texind], samp), t_st);
e = texture (sampler2DArray (textures[texind], samp), e_st);
frag_color = c + e;//fogBlend (c);
}