diff --git a/library/phx/rendering/render_passes/geometry_pass.cpp b/library/phx/rendering/render_passes/geometry_pass.cpp
index 434b0b0a6e91d04957279a1f8b31e21a1ee2bfdb..aeaf4a167e430320f97bdc6b11101f152b261998 100644
--- a/library/phx/rendering/render_passes/geometry_pass.cpp
+++ b/library/phx/rendering/render_passes/geometry_pass.cpp
@@ -67,6 +67,10 @@ void GeometryPass::UploadMeshData(
   mesh_cache_.clear();
   RenderOffset offset{0, 0};
   for (const auto& instance : rendering_instances) {
+    if (instance.material != nullptr) {
+      instance.material->UploadTextures();
+    }
+
     Mesh* mesh = instance.mesh;
     if (mesh_cache_.find(mesh) != mesh_cache_.end()) {
       continue;
diff --git a/library/phx/resources/types/material.cpp b/library/phx/resources/types/material.cpp
index cf0b925a2b12089a464e9910b295ad9bf89fcf69..49bd551988f68eedfbee0d585a378d54e50c785a 100644
--- a/library/phx/resources/types/material.cpp
+++ b/library/phx/resources/types/material.cpp
@@ -42,7 +42,7 @@ ResourcePointer<Image> Material::GetDiffuseImage() const {
 }
 void Material::SetDiffuseImage(ResourcePointer<Image> image) {
   diffuse_image_ = image;
-  SetTexture(diffuse_image_, &diffuse_texture_);
+  ResetTexture(&diffuse_texture_);
 }
 
 gl::texture_2d* Material::GetDiffuseTexture() const {
@@ -57,7 +57,7 @@ ResourcePointer<Image> Material::GetAmbientImage() const {
 }
 void Material::SetAmbientImage(ResourcePointer<Image> image) {
   ambient_image_ = image;
-  SetTexture(ambient_image_, &ambient_texture_);
+  ResetTexture(&ambient_texture_);
 }
 
 gl::texture_2d* Material::GetAmbientTexture() const {
@@ -72,7 +72,7 @@ ResourcePointer<Image> Material::GetSpecularImage() const {
 }
 void Material::SetSpecularImage(ResourcePointer<Image> image) {
   specular_image_ = image;
-  SetTexture(specular_image_, &specular_texture_);
+  ResetTexture(&specular_texture_);
 }
 
 gl::texture_2d* Material::GetSpecularTexture() const {
@@ -93,12 +93,23 @@ void Material::SetShininess(float shininess) {
 
 const Material* Material::GetDefault() { return &default_material_; }
 
+void Material::UploadTextures() {
+  if (!diffuse_texture_) {
+    SetTexture(diffuse_image_, &diffuse_texture_);
+  }
+  if (!specular_texture_) {
+    SetTexture(specular_image_, &specular_texture_);
+  }
+  if (!ambient_texture_) {
+    SetTexture(ambient_image_, &ambient_texture_);
+  }
+}
+
 void Material::SetTexture(ResourcePointer<Image> image,
                           std::shared_ptr<gl::texture_2d>* texture) {
   if (image == nullptr) return;
-  if (*texture && (*texture)->is_valid()) {
-    gl::texture_handle handle(*texture->get());
-    handle.set_resident(false);
+  if (*texture) {
+    ResetTexture(texture);
   }
 
   auto dimensions = image->GetDimensions();
@@ -123,4 +134,12 @@ void Material::SetTexture(ResourcePointer<Image> image,
   gl::print_error("[Material::SetTexture] OpenGl Error code");
 }
 
+void Material::ResetTexture(std::shared_ptr<gl::texture_2d>* texture) {
+  if (*texture && (*texture)->is_valid()) {
+    gl::texture_handle handle(*texture->get());
+    handle.set_resident(false);
+  }
+  texture->reset();
+}
+
 }  // namespace phx
diff --git a/library/phx/resources/types/material.hpp b/library/phx/resources/types/material.hpp
index ae74ee21dba19043c2478ae9a31cc2237e009b3b..fc839341bbf95af5e3ec719aeaaef0caf15a56b6 100644
--- a/library/phx/resources/types/material.hpp
+++ b/library/phx/resources/types/material.hpp
@@ -83,9 +83,13 @@ class PHOENIX_EXPORT Material : public Resource, public Nameable {
 
   static const Material* GetDefault();
 
+  // unless this was called Get..Texture return nullptr
+  void UploadTextures();
+
  private:
   void SetTexture(ResourcePointer<Image> image,
                   std::shared_ptr<gl::texture_2d>* texture);
+  void ResetTexture(std::shared_ptr<gl::texture_2d>* texture);
 
   ResourcePointer<Image> ambient_image_{nullptr};
   ResourcePointer<Image> diffuse_image_{nullptr};