quakeforge/libs/video/renderer/vulkan/alias.frag
Bill Currie d6b678ac78 [vulkan] Implement team colors
It's not quite as expected, but that may be due to one of msaa, the 0-15
range in the palette not being all the way to white, the color gradients
being not quite linear (haven't checked yet) or some combination of the
above. However, it's that what should be yellow is more green. At least
the zombies are no longer white and the ogres don't look like they're
wearing skeleton suits.
2021-02-02 19:53:36 +09:00

76 lines
1.9 KiB
GLSL

#version 450
layout (set = 0, binding = 2) uniform sampler2DArray Skin;
/*
layout (set = 2, binding = 0) uniform sampler2D Texture;
layout (set = 2, binding = 1) uniform sampler2D GlowMap;
layout (set = 2, binding = 2) uniform sampler2D ColorA;
layout (set = 2, binding = 3) uniform sampler2D ColorB;
*/
struct LightData {
vec3 color;
float dist;
vec3 position;
int type;
vec3 direction;
float cone;
};
layout (constant_id = 0) const int MaxLights = 8;
//layout (set = 1, binding = 0) uniform Lights {
layout (set = 0, binding = 1) uniform Lights {
int light_count;
LightData lights[MaxLights];
};
layout (push_constant) uniform PushConstants {
layout (offset = 68)
uint base_color;
uint colorA;
uint colorB;
vec4 fog;
vec4 color;
};
layout (location = 0) in vec2 st;
layout (location = 1) in vec3 position;
layout (location = 2) in vec3 normal;
layout (location = 0) out vec4 frag_color;
vec3
calc_light (LightData light)
{
if (light.type == 0) {
vec3 dist = light.position - position;
float dd = dot (dist, dist);
float mag = max (0.0, dot (dist, normal));
return light.color * mag * light.dist / dd;
} else if (light.type == 1) {
} else if (light.type == 2) {
float mag = max (0.0, -dot (light.direction, normal));
// position is ambient light
return light.color * dot (light.direction, normal) + light.position;
}
}
void
main (void)
{
vec4 c;
int i;
vec3 light = vec3 (0);
c = texture (Skin, vec3 (st, 0)) * unpackUnorm4x8(base_color);
c += texture (Skin, vec3 (st, 1)) * unpackUnorm4x8(colorA);
c += texture (Skin, vec3 (st, 2)) * unpackUnorm4x8(colorB);
if (MaxLights > 0) {
for (i = 0; i < light_count; i++) {
light += calc_light (lights[i]);
}
}
c *= vec4 (light, 1);
c += texture (Skin, vec3 (st, 3));
//frag_color = vec4((normal + 1)/2, 1);
frag_color = c;//fogBlend (c);
}