Index: shaders/model.frag
===================================================================
--- shaders/model.frag	(revision aa7e5f02d65eda57e6410dbfc26d5ef3e252bcc6)
+++ shaders/model.frag	(revision a00eb0672f52310ddbe89f59abd3191cb3c993ed)
@@ -6,8 +6,9 @@
 layout(location = 0) in vec3 fragColor;
 layout(location = 1) in vec2 fragTexCoord;
+layout(location = 2) in vec3 normal_eye;
 
 layout(location = 0) out vec4 outColor;
 
 void main() {
-   outColor = vec4(fragColor * texture(texSampler, fragTexCoord).rgb, 1.0);
+   outColor = vec4(fragColor * texture(texSampler, fragTexCoord).rgb, 1.0) + vec4(normal_eye, 0.0) - vec4(normal_eye, 0.0);
 }
Index: shaders/model.vert
===================================================================
--- shaders/model.vert	(revision aa7e5f02d65eda57e6410dbfc26d5ef3e252bcc6)
+++ shaders/model.vert	(revision a00eb0672f52310ddbe89f59abd3191cb3c993ed)
@@ -15,13 +15,22 @@
 } sbo;
 
+layout (binding = 2) uniform UboInstance {
+	mat4 model;
+} uboInstance;
+
 layout(location = 0) in vec3 inPosition;
 layout(location = 1) in vec3 inColor;
 layout(location = 2) in vec2 inTexCoord;
-layout(location = 3) in uint obj_index;
+layout(location = 3) in vec3 vertex_normal;
+layout(location = 4) in uint obj_index;
 
 layout(location = 0) out vec3 fragColor;
 layout(location = 1) out vec2 fragTexCoord;
+layout(location = 2) out vec3 normal_eye;
 
 void main() {
+   // Using 0.0 instead of 1.0 means translations won't effect the normal
+   normal_eye = normalize(vec3(ubo.view * sbo.objects[obj_index].model * vec4(vertex_normal, 0.0)));
+
    fragColor = inColor;
    fragTexCoord = inTexCoord;
