diff --git a/include/vkcv/ShaderProgram.hpp b/include/vkcv/ShaderProgram.hpp
index 459125bbd3208ffb40815e1e3fd4c9615ce21724..896f84d3f6cf854e364498643050d2c0db5085e4 100644
--- a/include/vkcv/ShaderProgram.hpp
+++ b/include/vkcv/ShaderProgram.hpp
@@ -22,7 +22,8 @@ namespace vkcv {
         TESS_EVAL,
         GEOMETRY,
         FRAGMENT,
-        COMPUTE
+        COMPUTE,
+        ALL
     };
 
     struct Shader
diff --git a/modules/material/CMakeLists.txt b/modules/material/CMakeLists.txt
index 660f59b45a34766466fcf10d80cf7179a86e79db..c7b204dbf23d48bd1402412092bc43bfe3da2e0f 100644
--- a/modules/material/CMakeLists.txt
+++ b/modules/material/CMakeLists.txt
@@ -12,6 +12,8 @@ set(vkcv_material_include ${PROJECT_SOURCE_DIR}/include)
 set(vkcv_material_sources
 		${vkcv_material_include}/vkcv/material/Material.hpp
 		${vkcv_material_source}/vkcv/material/Material.cpp
+		${vkcv_material_include}/vkcv/material/pbrMetallicRoughness.hpp
+		${vkcv_material_source}/vkcv/material/pbrMetallicRoughness.cpp
 )
 
 # adding source files to the module
diff --git a/modules/material/include/vkcv/material/pbrMetallicRoughness.hpp b/modules/material/include/vkcv/material/pbrMetallicRoughness.hpp
new file mode 100644
index 0000000000000000000000000000000000000000..db8c200a92e7fd723115104ee942278d4ae3ccc6
--- /dev/null
+++ b/modules/material/include/vkcv/material/pbrMetallicRoughness.hpp
@@ -0,0 +1,49 @@
+#pragma once
+
+#include <vector>
+
+#include "Material.hpp"
+#include "vkcv/Handles.hpp"
+#include "vkcv/DescriptorConfig.hpp"
+
+namespace vkcv
+{
+    class pbrMaterial : Material
+    {
+    public:
+        pbrMaterial() = delete;
+        pbrMaterial(const ImageHandle           &colorImg,
+                    const SamplerHandle         &colorSmp,
+                    const ImageHandle           &normalImg,
+                    const SamplerHandle         &normalSmp,
+                    const ImageHandle           &metRoughImg,
+                    const SamplerHandle         &metRoughSmp,
+                    const DescriptorSetHandle   &setHandle) noexcept;
+
+        const ImageHandle   m_ColorTexture;
+        const SamplerHandle m_ColorSampler;
+
+        const ImageHandle   m_NormalTexture;
+        const SamplerHandle m_NormalSampler;
+
+        const ImageHandle   m_MetRoughTexture;
+        const SamplerHandle m_MetRoughSampler;
+
+        // ImageHandle m_OcclusionTexture;
+        // SamplerHandle m_EmissiveTexture;
+
+        const DescriptorSetHandle m_DescriptorSetHandle;
+
+        /*
+        * Returns the material's necessary descriptor bindings which serves as its descriptor layout
+        * The binding is in the following order:
+        * 0 - diffuse texture
+        * 1 - diffuse sampler
+        * 2 - normal texture
+        * 3 - normal sampler
+        * 4 - metallic roughness texture
+        * 5 - metallic roughness sampler
+        */
+        static std::vector<DescriptorBinding> getDescriptorBindings() noexcept;
+    };
+}
\ No newline at end of file
diff --git a/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d644113af882e255e4b065668b1540b575c4f705
--- /dev/null
+++ b/modules/material/src/vkcv/material/pbrMetallicRoughness.cpp
@@ -0,0 +1,30 @@
+#include "vkcv/material/pbrMetallicRoughness.hpp"
+
+namespace vkcv
+{
+    pbrMaterial::pbrMaterial(const ImageHandle          &colorImg,
+                             const SamplerHandle        &colorSmp,
+                             const ImageHandle          &normalImg,
+                             const SamplerHandle        &normalSmp,
+                             const ImageHandle          &metRoughImg,
+                             const SamplerHandle        &metRoughSmp,
+                             const DescriptorSetHandle  &setHandle) noexcept :
+    m_ColorTexture(colorImg),
+    m_ColorSampler(colorSmp),
+    m_NormalTexture(normalImg),
+    m_NormalSampler(normalSmp),
+    m_MetRoughTexture(metRoughImg),
+    m_MetRoughSampler(metRoughSmp),
+    m_DescriptorSetHandle(setHandle)
+    {}
+
+    std::vector<DescriptorBinding> pbrMaterial::getDescriptorBindings() noexcept
+    {
+        return {{DescriptorType::IMAGE_SAMPLED, 1, ShaderStage::FRAGMENT},
+                {DescriptorType::SAMPLER      , 1, ShaderStage::FRAGMENT},
+                {DescriptorType::IMAGE_SAMPLED, 1, ShaderStage::FRAGMENT},
+                {DescriptorType::SAMPLER      , 1, ShaderStage::FRAGMENT},
+                {DescriptorType::IMAGE_SAMPLED, 1, ShaderStage::FRAGMENT},
+                {DescriptorType::SAMPLER      , 1, ShaderStage::FRAGMENT}};
+    }
+}
\ No newline at end of file