Index: shaders/laser.frag
===================================================================
--- shaders/laser.frag	(revision 7297892d3ee9f767f9adec44726c263f23bbb4da)
+++ shaders/laser.frag	(revision 7297892d3ee9f767f9adec44726c263f23bbb4da)
@@ -0,0 +1,26 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+struct Object {
+   mat4 model;
+   vec3 color;
+   bool deleted;
+};
+
+layout(binding = 1) readonly buffer StorageBufferObject {
+   Object objects[];
+} sbo;
+
+layout(binding = 2) uniform sampler2D laser_texture;
+
+layout(location = 0) in vec2 texcoords_fs;
+layout(location = 1) flat in uint obj_index_fs;
+
+layout(location = 0) out vec4 frag_color;
+
+void main() {
+   vec4 texel = texture(laser_texture, texcoords_fs);
+   vec3 laser_color = sbo.objects[obj_index_fs].color;
+
+   frag_color = vec4(texel.r * laser_color.r, texel.g * laser_color.g, texel.b * laser_color.b, texel.a);
+}
Index: shaders/laser.vert
===================================================================
--- shaders/laser.vert	(revision 7297892d3ee9f767f9adec44726c263f23bbb4da)
+++ shaders/laser.vert	(revision 7297892d3ee9f767f9adec44726c263f23bbb4da)
@@ -0,0 +1,37 @@
+#version 450
+#extension GL_ARB_separate_shader_objects : enable
+
+struct Object {
+   mat4 model;
+   vec3 color;
+   bool deleted;
+};
+
+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 vec2 texcoords_vs;
+layout(location = 2) in uint obj_index_vs;
+
+layout(location = 0) out vec2 texcoords_fs;
+layout(location = 1) out uint obj_index_fs;
+
+void main() {
+   vec3 position_eye = vec3(ubo.view * sbo.objects[obj_index_vs].model * vec4(vertex_position, 1.0));
+
+   texcoords_fs = texcoords_vs;
+   obj_index_fs = obj_index_vs;
+
+   if (sbo.objects[obj_index_vs].deleted) {
+      gl_Position = vec4(0.0, 0.0, 2.0, 1.0);
+   } else {
+      gl_Position = ubo.proj * vec4(position_eye, 1.0);
+   }
+}
