Index: shaders/shader.frag
===================================================================
--- shaders/shader.frag	(revision de32fdaea94305c3a14e4d64c54d31f4571bd34f)
+++ shaders/shader.frag	(revision fba08f2fbc19f8270137475a481ae67edd4e57fd)
@@ -2,9 +2,14 @@
 #extension GL_ARB_separate_shader_objects : enable
 
+layout(binding = 1) uniform sampler2D texSampler;
+
 layout(location = 0) in vec3 fragColor;
+layout(location = 1) in vec2 fragTexCoord;
 
 layout(location = 0) out vec4 outColor;
 
 void main() {
-    outColor = vec4(fragColor, 1.0);
+   // outColor = vec4(fragColor, 1.0);
+   // outColor = texture(texSampler, fragTexCoord);
+   outColor = vec4(fragColor * texture(texSampler, fragTexCoord).rgb, 1.0);
 }
Index: shaders/shader.vert
===================================================================
--- shaders/shader.vert	(revision de32fdaea94305c3a14e4d64c54d31f4571bd34f)
+++ shaders/shader.vert	(revision fba08f2fbc19f8270137475a481ae67edd4e57fd)
@@ -1,4 +1,10 @@
 #version 450
 #extension GL_ARB_separate_shader_objects : enable
+
+vec2 positions[3] = vec2[](
+    vec2( 0.0,  0.5),
+    vec2(-0.5, -0.5),
+    vec2( 0.5, -0.5)
+);
 
 layout (binding = 0) uniform UniformBufferObject {
@@ -10,9 +16,13 @@
 layout(location = 0) in vec2 inPosition;
 layout(location = 1) in vec3 inColor;
+layout(location = 2) in vec2 inTexCoord;
 
 layout(location = 0) out vec3 fragColor;
+layout(location = 1) out vec2 fragTexCoord;
 
 void main() {
-   gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
+   // gl_Position = ubo.proj * ubo.view * ubo.model * vec4(inPosition, 0.0, 1.0);
+   gl_Position = ubo.proj * ubo.view * ubo.model * vec4(positions[gl_VertexIndex], -5.0, 1.0);
    fragColor = inColor;
+   fragTexCoord = inTexCoord;
 }
