diff --git a/include/gear/graphics/renderer.h b/include/gear/graphics/renderer.h
index 3ed05bf..3be62c8 100644
--- a/include/gear/graphics/renderer.h
+++ b/include/gear/graphics/renderer.h
@@ -11,7 +11,7 @@ typedef struct g_renderer {
 } g_renderer;
 
 typedef struct g_renderer_object {
-    sg_bindings bind;
+    sg_bindings* bind;
     sg_pipeline pipeline;
 } g_renderer_object;
 
diff --git a/shaders/simple.glsl b/shaders/simple.glsl
new file mode 100644
index 0000000..4c293a1
--- /dev/null
+++ b/shaders/simple.glsl
@@ -0,0 +1,23 @@
+@vs vs
+in vec4 pos;
+in vec4 color0;
+
+out vec4 color;
+
+void main() {
+    gl_Position = pos;
+    color = color0;
+}
+@end
+
+@fs fs
+in vec4 color;
+out vec4 frag_color;
+
+void main() {
+    frag_color = color;
+}
+@end
+
+@program simple vs fs
+
diff --git a/src/graphics/renderer/renderer.c b/src/graphics/renderer/renderer.c
index 620e5fc..258306a 100644
--- a/src/graphics/renderer/renderer.c
+++ b/src/graphics/renderer/renderer.c
@@ -9,9 +9,9 @@ void g_renderer_begin(g_renderer* renderer) {
 void g_renderer_draw(g_renderer* renderer, g_renderer_object object, u32 elements) {
     if(renderer->bound_pipeline_id != object.pipeline.id) {
         g_pipeline_bind(renderer, object.pipeline);
-        sg_apply_bindings(&object.bind);
     }
 
+    sg_apply_bindings(object.bind);
     sg_draw(0, elements, 1);
 };
 
diff --git a/src/main.c b/src/main.c
index 31d5419..c385c1f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,19 +1,34 @@
+#include "HandmadeMath/HandmadeMath.h"
+#include "gear/base.h"
+#include "gear/graphics/pipeline.h"
+#include "gear/images.h"
+#include "slibs/slibs.h"
 #include <gear/graphics/renderer.h>
 #include <gear/camera.h>
 #include <gear/ui/gui.h>
 #include <gear/ui/console.h>
 #include <gear/resources.h>
+#include <gear/graphics/models.h>
+#include <shaders/transform.glsl.h>
 
 #include <sokol/sokol_app.h>
 #include <sokol/sokol_gfx.h>
 #include <sokol/sokol_log.h>
 #include <sokol/sokol_glue.h>
 
+#include <stb/stb_image.h>
+
 #include <log.c/log.h>
 
+#include <gear/graphics/textures.h>
+
 g_renderer* renderer;
 g_camera* camera;
 g_gui* gui;
+g_model* model;
+sg_pipeline pipeline;
+sg_bindings* bind;
+sg_attachments attachments;
 
 void init() {
     sg_setup(&(sg_desc){
@@ -29,12 +44,62 @@ void init() {
     for(sl_vec_it(layer, gui->layers)) {
         log_info("    %s", (*layer)->name);
     }
+
+    g_vertex vertices[] = {
+        {  1.0f,  1.0f, 0.0f, G_WHITE, 1.0f * 32767, 1.0f * 32767 },   // top right
+        {  1.0f, -1.0f, 0.0f, G_WHITE, 1.0f * 32767, 0.0f * 32767 },  // bottom right
+        { -1.0f, -1.0f, 0.0f, G_WHITE, 0.0f * 32767, 0.0f * 32767 },  // bottom left
+        { -1.0f,  1.0f, 0.0f, G_WHITE, 0.0f * 32767, 1.0f * 32767 }  // top left 
+    };
+
+    uint32_t indices[] = {
+        0, 1, 3,
+        1, 2, 3
+    };
+
+    g_vertex_vec vertices_vec = { 0 };
+    g_index_vec indices_vec = { 0 };
+    sl_vec_from_arr(vertices_vec, vertices);
+    sl_vec_from_arr(indices_vec, indices);
+
+    model = g_model_create(&vertices_vec, &indices_vec);
+
+    bind = calloc(1, sizeof(sg_bindings));
+    bind->vertex_buffers[0] = model->vertex_buffer;
+    bind->index_buffer = model->index_buffer;
+
+    g_texture* texture = g_texture_create_filtered(g_image_default(), SG_FILTER_NEAREST, SG_FILTER_NEAREST);
+    bind->fs.images[SLOT_tex] = texture->image;
+    bind->fs.samplers[SLOT_smp] = texture->sampler;
+
+    sg_shader shd = sg_make_shader(transform_shader_desc(sg_query_backend()));
+
+    pipeline = g_pipeline_create(shd, (sg_vertex_layout_state){
+        .attrs = {
+            [ATTR_vs_pos].format = SG_VERTEXFORMAT_FLOAT3,
+            [ATTR_vs_color0].format = SG_VERTEXFORMAT_UBYTE4N,
+            [ATTR_vs_texcoord0].format = SG_VERTEXFORMAT_SHORT2N,
+        }
+    });
 }
 
 void frame() {
     g_gui_update(gui);
 
     g_renderer_begin(renderer);
+    g_pipeline_bind(renderer, pipeline);
+
+    vs_params_t vs_params = {
+        .mvp = HMM_Mul(g_camera_matrix(camera), HMM_Rotate_LH(HMM_AngleDeg(45.0f), HMM_V3(1.0f, 0.0f, 0.0f))),
+        .texture_scale = HMM_V2(1.0f, 1.0f)
+    };
+
+    sg_apply_uniforms(SG_SHADERSTAGE_VS, SLOT_vs_params, SG_RANGE_REF(vs_params));
+
+    g_renderer_draw(renderer, (g_renderer_object){
+        .pipeline = pipeline,
+        .bind = bind
+    }, model->indices.size);
     g_gui_render(sapp_width(), sapp_height());
     g_renderer_end(renderer);
 }