diff --git a/programs/lab5/CMakeLists.txt b/programs/lab5/CMakeLists.txt
index 6ffdf65..1a5fcb1 100644
--- a/programs/lab5/CMakeLists.txt
+++ b/programs/lab5/CMakeLists.txt
@@ -5,6 +5,7 @@ add_executable(
         src/sprite_data.hpp
         src/model.cpp
         src/triangle.hpp
+        src/sort.hpp
 
 )
 target_link_libraries(lab5 PRIVATE Qt5::Core Qt5::Widgets renderer_api utilities qt_utilities)
\ No newline at end of file
diff --git a/programs/lab5/src/main.cpp b/programs/lab5/src/main.cpp
index a49c247..476958d 100644
--- a/programs/lab5/src/main.cpp
+++ b/programs/lab5/src/main.cpp
@@ -14,6 +14,7 @@
 #include <bgtu/computer_graphics_lab_work/qt_utilities/renderer_widget.hpp>
 #include <bgtu/computer_graphics_lab_work/qt_utilities/keyboard_catcher_widget.hpp>
 #include "sprite_data.hpp"
+#include "sort.hpp"
 #include "model.hpp"
 
 namespace BGTU::ComputerGraphicsLabWork::Impl {
@@ -40,11 +41,12 @@ namespace BGTU::ComputerGraphicsLabWork::Impl {
 		QObject::connect(&kbd, &QtUtilities::KeyboardCatcherWidget::key_pressed_PageUp, &sprites_data_custom, &SpriteData::Provider::inc_scale);
 		QObject::connect(&kbd, &QtUtilities::KeyboardCatcherWidget::key_pressed_P, &sprites_data_custom, &SpriteData::Provider::switch_projection);
 
+		SortSprite sprites_sort{sprites, sprites_count};
+		SortSprite *sprites_sort_arr[1] = {&sprites_sort};
 
-
-			QtUtilities::SeparateThreadedDefaultRendererLinear<SpriteData> renderer_custom{};
+		QtUtilities::SeparateThreadedDefaultRendererLinear<SpriteData> renderer_custom{};
 		renderer_custom.set_sprite_data_provider(&sprites_data_custom);
-		renderer_custom.set_sprites(reinterpret_cast<RendererApi::Sprite <SpriteData,  Utilities::DefaultVoxelDrawerCache::VoxelPainterImpl> *const *>(sprites), sprites_count);
+		renderer_custom.set_sprites(reinterpret_cast<RendererApi::Sprite<SpriteData, Utilities::DefaultVoxelDrawerCache::VoxelPainterImpl> *const *>(sprites_sort_arr), 1);
 		renderer_custom.set_background(BGTU::ComputerGraphicsLabWork::RendererApi::Color{0, 0, 0});
 
 
diff --git a/programs/lab5/src/sort.hpp b/programs/lab5/src/sort.hpp
new file mode 100644
index 0000000..3cbad21
--- /dev/null
+++ b/programs/lab5/src/sort.hpp
@@ -0,0 +1,42 @@
+#pragma once
+
+#include <algorithm>
+
+#include <bgtu/computer_graphics_lab_work/renderer_api/point.hpp>
+#include <bgtu/computer_graphics_lab_work/renderer_api/sprite.hpp>
+#include <bgtu/computer_graphics_lab_work/utilities/matrix.hpp>
+#include <bgtu/computer_graphics_lab_work/utilities/shader.hpp>
+#include <bgtu/computer_graphics_lab_work/utilities/shapes/triangle.hpp>
+
+#include "triangle.hpp"
+
+
+namespace BGTU::ComputerGraphicsLabWork::Impl {
+	class SortSprite : public RendererApi::Sprite<SpriteData> {
+	private:
+		Triangle const *const *triangles;
+		std::size_t triangles_count;
+	public:
+		SortSprite(
+				Triangle const *const *triangles,
+				std::size_t triangles_count
+
+		) : triangles{triangles}, triangles_count{triangles_count} {}
+
+		void draw(BGTU::ComputerGraphicsLabWork::RendererApi::VirtualVoxelPainter *frame, SpriteData const *data) const override {
+			auto indices = new std::size_t[this->triangles_count];
+			for (std::size_t i = this->triangles_count; i-- > 0;) {
+				indices[i] = i;
+			}
+
+			std::sort(indices, indices + this->triangles_count, [this](std::size_t l, std::size_t r) -> bool {
+				return (this->triangles[l]->triangle_p0.z + this->triangles[l]->triangle_p1.z + this->triangles[l]->triangle_p2.z) / 3 > (this->triangles[r]->triangle_p0.z + this->triangles[r]->triangle_p1.z + this->triangles[r]->triangle_p2.z) / 3;
+			});
+
+			for (std::size_t i = 0; i < this->triangles_count; i++) {
+				this->triangles[indices[i]]->draw(frame, data);
+			}
+			delete[] indices;
+		}
+	};
+}
\ No newline at end of file