diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index 360a49adedb7409ebb86e5cd6a83f31ca4845581..207d2fb90d7461302cbd68bf6241a0c9653c08f0 100644
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -6,7 +6,8 @@
                 "${workspaceFolder}/include",
                 "~/.conan/data/",
                 "/home/tim/.conan/data/gl3w/0.2/tuebel/testing/package/1a651c5b4129ad794b88522bece2281a7453aee4/include",
-                "/home/tim/.conan/data/glfw/3.2.1/bincrafters/stable/package/db2ca884c9793e0b0fb54ec3f846326d1addacc8/include"
+                "/home/tim/.conan/data/glfw/3.2.1/bincrafters/stable/package/db2ca884c9793e0b0fb54ec3f846326d1addacc8/include",
+                "/home/tim/.conan/data/glm/0.9.9.1/g-truc/stable/package/5ab84d6acfe1f23c4fae0ab88f26e3a396351ac9/include"
             ],
             "defines": [],
             "cStandard": "c11",
diff --git a/include/scigl_render/check_gl_error.hpp b/include/scigl_render/check_gl_error.hpp
index 0a0e4a761389d6b6bc57e2bcf965008c15b3ebf2..95b11bc0a1692f78899a3f7e19805f38d4c536dd 100644
--- a/include/scigl_render/check_gl_error.hpp
+++ b/include/scigl_render/check_gl_error.hpp
@@ -1,18 +1,15 @@
 #pragma once
 #include <GL/gl3w.h>
-#include <sstream>
-#include <stdexcept>
+#include <iostream>
 
 namespace scigl_render
 {
 inline void check_gl_error(const std::string& msg)
 {
   GLenum err;
-  if ((err = glGetError()) != GL_NO_ERROR)
+  while ((err = glGetError()) != GL_NO_ERROR)
   {
-    std::stringstream stream;
-    stream << msg << std::hex << err;
-    throw std::runtime_error(stream.str());
+    std::cerr << "OpenGL error: " << msg << std::hex << err << "\n";
   }
 }
 } // namespace scigl_render
\ No newline at end of file
diff --git a/include/scigl_render/render/rasterizer.hpp b/include/scigl_render/render/rasterizer.hpp
index 5b3715135290dfbf07e76ff55cec5585ee3a6b8b..4072fd61c8185853b400ff6bbd74c29d22f4d60d 100644
--- a/include/scigl_render/render/rasterizer.hpp
+++ b/include/scigl_render/render/rasterizer.hpp
@@ -102,6 +102,8 @@ public:
   size_t get_views_per_column() const;
   size_t get_view_width() const;
   size_t get_view_height() const;
+  size_t get_texture_width() const;
+  size_t get_texture_height() const;
   void set_views_per_row(size_t views_per_row);
   void set_views_per_column(size_t views_per_column);
   void set_view_width(size_t width);
diff --git a/include/scigl_render/shader/shader.hpp b/include/scigl_render/shader/shader.hpp
index f5f901b7790a1349c36b3e4adcfeb4db6577a696..cd9025928ddb4187bb58ed7b3a6f0fcefd7981bd 100644
--- a/include/scigl_render/shader/shader.hpp
+++ b/include/scigl_render/shader/shader.hpp
@@ -32,6 +32,9 @@ public:
   /*! Set the uniform variable value in the shader program. */
   void setInt(const std::string &name, int value) const;
 
+  /*! Set the uniform variable value in the shader program. */
+  void setUInt(const std::string &name, uint32_t value) const;
+
   /*! Set the uniform variable value in the shader program. */
   void setFloat(const std::string &name, float value) const;
 
@@ -64,7 +67,27 @@ public:
   void setMat4(const std::string &name, const glm::mat4 &mat) const;
 
   /*! Set the uniform variable value in the shader program. */
-  void setArray(const std::string &name, const float array[], int count) const;
+  void setUVec2(const std::string &name, const glm::uvec2 &value) const;
+
+  /*! Set the uniform variable value in the shader program. */
+  void setUVec3(const std::string &name, const glm::uvec3 &value) const;
+
+  /*! Set the uniform variable value in the shader program. */
+  void setUVec4(const std::string &name, const glm::uvec4 &value) const;
+
+  /*! Set the uniform variable value in the shader program. */
+  void setUVec2(const std::string &name, uint32_t x, uint32_t y) const;
+
+  /*! Set the uniform variable value in the shader program. */
+  void setUVec3(const std::string &name,
+                uint32_t x, uint32_t y, uint32_t z) const;
+
+  /*! Set the uniform variable value in the shader program. */
+  void setUVec4(const std::string &name,
+                uint32_t x, uint32_t y, uint32_t z, uint32_t w) const;
+
+  /*! Set the uniform variable value in the shader program. */
+  void setFloatArray(const std::string &name, const float array[], int count) const;
 
 private:
   /*!
diff --git a/src/render/rasterizer.cpp b/src/render/rasterizer.cpp
index 18156a5f627462575bad73b4c297c26b35cacd87..0caaaca66c865ec319834d358226a508f83a2d24 100644
--- a/src/render/rasterizer.cpp
+++ b/src/render/rasterizer.cpp
@@ -71,6 +71,14 @@ size_t Rasterizer::get_view_height() const
 {
   return height;
 }
+size_t Rasterizer::get_texture_width() const
+{
+  return texture_width;
+}
+size_t Rasterizer::get_texture_height() const
+{
+  return texture_height;
+}
 void Rasterizer::set_views_per_row(size_t views_per_row)
 {
   this->views_per_row = views_per_row;
diff --git a/src/scene/cv_camera.cpp b/src/scene/cv_camera.cpp
index 31b46a218ceef656b5813a47ba5611444013dba2..b223bf548f1794127ba653eaf1b9fdd735fc3cee 100644
--- a/src/scene/cv_camera.cpp
+++ b/src/scene/cv_camera.cpp
@@ -79,7 +79,7 @@ void CvCamera::set_in_shader(const Shader &shader) const
 {
   shader.activate();
   shader.setVec3("camera_position", this->pose.position);
-  shader.setArray("dist_coeffs", this->intrinsics.dist_coeffs,
+  shader.setFloatArray("dist_coeffs", this->intrinsics.dist_coeffs,
                   sizeof(this->intrinsics.dist_coeffs));
   shader.setMat4("projection_matrix", get_projection_matrix());
   shader.setMat4("view_matrix", get_view_matrix());
diff --git a/src/shader/shader.cpp b/src/shader/shader.cpp
index 049fbd9b805b7fdc86708634f08b9c1d4804fe66..22c6fcf4beffd5c34e9cdcb0540e33f330f4dae8 100644
--- a/src/shader/shader.cpp
+++ b/src/shader/shader.cpp
@@ -38,6 +38,11 @@ void Shader::setInt(const std::string &name, int value) const
   glUniform1i(glGetUniformLocation(program_id, name.c_str()), value);
 }
 
+void Shader::setUInt(const std::string &name, uint32_t value) const
+{
+  glUniform1ui(glGetUniformLocation(program_id, name.c_str()), value);
+}
+
 void Shader::setFloat(const std::string &name, float value) const
 {
   glUniform1f(glGetUniformLocation(program_id, name.c_str()), value);
@@ -92,7 +97,39 @@ void Shader::setMat4(const std::string &name, const glm::mat4 &mat) const
                      GL_FALSE, &mat[0][0]);
 }
 
-void Shader::setArray(
+void Shader::setUVec2(const std::string &name, const glm::uvec2 &value) const
+{
+  glUniform2uiv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
+}
+
+void Shader::setUVec3(const std::string &name, const glm::uvec3 &value) const
+{
+  glUniform3uiv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
+}
+
+void Shader::setUVec4(const std::string &name, const glm::uvec4 &value) const
+{
+  glUniform4uiv(glGetUniformLocation(program_id, name.c_str()), 1, &value[0]);
+}
+
+void Shader::setUVec2(const std::string &name, uint32_t x, uint32_t y) const
+{
+  glUniform2ui(glGetUniformLocation(program_id, name.c_str()), x, y);
+}
+
+void Shader::setUVec3(const std::string &name,
+                      uint32_t x, uint32_t y, uint32_t z) const
+{
+  glUniform3ui(glGetUniformLocation(program_id, name.c_str()), x, y, z);
+}
+
+void Shader::setUVec4(const std::string &name,
+                      uint32_t x, uint32_t y, uint32_t z, uint32_t w) const
+{
+  glUniform4ui(glGetUniformLocation(program_id, name.c_str()), x, y, z, w);
+}
+
+void Shader::setFloatArray(
     const std::string &name, const float array[], int count) const
 {
   glUniform1fv(glGetUniformLocation(program_id, name.c_str()), count, array);