mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-15 01:11:27 +00:00
d6b678ac78
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.
76 lines
1.9 KiB
GLSL
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);
|
|
}
|