Index: shaders/asteroid.frag
===================================================================
--- shaders/asteroid.frag	(revision 3e8cc8b7aef266654d80c142b7d4436950ceba1f)
+++ shaders/asteroid.frag	(revision 3e8cc8b7aef266654d80c142b7d4436950ceba1f)
@@ -0,0 +1,57 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+layout(location = 0) in vec3 position_eye;
+layout(location = 1) in vec3 color;
+layout(location = 2) in vec3 normal_eye;
+layout(location = 3) in vec3 light_position_eye;
+layout(location = 4) in vec3 light2_position_eye;
+
+layout(location = 0) out vec4 frag_color;
+
+// fixed point light properties
+vec3 Ls = vec3(1.0, 1.0, 1.0);
+vec3 Ld = vec3(1.0, 1.0, 1.0);
+vec3 La = vec3(0.2, 0.2, 0.2);
+
+// surface reflectance
+vec3 Ks = vec3(1.0, 1.0, 1.0);
+vec3 Kd = vec3(1.0, 1.5, 1.0);
+vec3 Ka = vec3(0.2, 0.2, 0.2);
+float specular_exponent = 100.0; // specular 'power'
+
+void main() {
+  // ambient intensity
+  vec3 Ia = La * Ka;
+
+  // ambient intensity
+  vec3 Ia2 = La * Ka;
+
+  vec3 direction_to_light_eye = normalize(light_position_eye - position_eye);
+  float dot_prod = max(dot(direction_to_light_eye, normal_eye), 0.0);
+
+  // diffuse intensity
+  vec3 Id = Ld * color * dot_prod;
+
+  vec3 direction_to_light2_eye = normalize(light2_position_eye - position_eye);
+  float dot_prod2 = max(dot(direction_to_light2_eye, normal_eye), 0.0);
+
+  // diffuse intensity
+  vec3 Id2 = Ld * color * dot_prod2;
+
+  vec3 surface_to_viewer_eye = normalize(-position_eye);
+
+  vec3 reflection_eye = reflect(-direction_to_light_eye, normal_eye);
+  float dot_prod_specular = max(dot(reflection_eye, surface_to_viewer_eye), 0.0);
+  float specular_factor = pow(dot_prod_specular, specular_exponent);
+
+  vec3 reflection_eye2 = reflect(-direction_to_light2_eye, normal_eye);
+  float dot_prod_specular2 = max(dot(reflection_eye2, surface_to_viewer_eye), 0.0);
+  float specular_factor2 = pow(dot_prod_specular2, specular_exponent);
+
+  // specular intensity
+  vec3 Is = Ls * Ks * specular_factor;
+  vec3 Is2 = Ls * Ks * specular_factor2;
+
+  frag_color = vec4((Is + Id + Ia + Is2 + Id2 + Ia2)/2, 1.0);
+}
Index: shaders/asteroid.vert
===================================================================
--- shaders/asteroid.vert	(revision 3e8cc8b7aef266654d80c142b7d4436950ceba1f)
+++ shaders/asteroid.vert	(revision 3e8cc8b7aef266654d80c142b7d4436950ceba1f)
@@ -0,0 +1,45 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+struct Object {
+   mat4 model;
+   float hp;
+};
+
+layout (binding = 0) uniform UniformBufferObject {
+   mat4 view;
+   mat4 proj;
+} ubo;
+
+layout(binding = 1) readonly buffer StorageBufferObject {
+    Object objects[];
+} sbo;
+
+layout(location = 0) in vec3 vertex_position;
+layout(location = 1) in vec3 vertex_color;
+layout(location = 2) in vec3 vertex_normal;
+layout(location = 3) in uint obj_index;
+
+layout(location = 0) out vec3 position_eye;
+layout(location = 1) out vec3 color;
+layout(location = 2) out vec3 normal_eye;
+layout(location = 3) out vec3 light_position_eye;
+layout(location = 4) out vec3 light2_position_eye;
+
+// fixed point light position
+vec3 light_position_world = vec3(0.0, 0.0, 2.0);
+vec3 light2_position_world = vec3(0.0, 1.5, -0.1);
+
+void main() {
+  position_eye = vec3(ubo.view * sbo.objects[obj_index].model * vec4(vertex_position, 1.0));
+  normal_eye = normalize(vec3(ubo.view * sbo.objects[obj_index].model * vec4(vertex_normal, 0.0)));
+
+  float hp_percent = sbo.objects[obj_index].hp / 10.0;
+  vec3 damage_color = vec3(1.0, 0.0, 0.0);
+  color = (vertex_color * hp_percent) + (damage_color * (1.0 - hp_percent));
+
+  light_position_eye = vec3(ubo.view * vec4(light_position_world, 1.0));
+  light2_position_eye = vec3(ubo.view * vec4(light2_position_world, 1.0));
+
+  gl_Position = ubo.proj * vec4(position_eye, 1.0);
+}
