#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); }