From 8027e6a48c276fad502d8048084904ff341cbd15 Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Sun, 20 Jun 2021 11:47:32 +0200
Subject: [PATCH] [#82] Load normal and specular textures

---
 .../resources/shaders/perMeshResources.inc    |  4 +-
 projects/voxelization/src/main.cpp            | 47 +++++++++++++++----
 2 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/projects/voxelization/resources/shaders/perMeshResources.inc b/projects/voxelization/resources/shaders/perMeshResources.inc
index 95e4fb7c..b1523713 100644
--- a/projects/voxelization/resources/shaders/perMeshResources.inc
+++ b/projects/voxelization/resources/shaders/perMeshResources.inc
@@ -1,2 +1,4 @@
 layout(set=1, binding=0) uniform texture2D  albedoTexture;
-layout(set=1, binding=1) uniform sampler    textureSampler;
\ No newline at end of file
+layout(set=1, binding=1) uniform sampler    textureSampler;
+layout(set=1, binding=2) uniform texture2D  normalTexture;
+layout(set=1, binding=3) uniform texture2D  specularTexture;
\ No newline at end of file
diff --git a/projects/voxelization/src/main.cpp b/projects/voxelization/src/main.cpp
index 309c75d5..f679a345 100644
--- a/projects/voxelization/src/main.cpp
+++ b/projects/voxelization/src/main.cpp
@@ -186,24 +186,55 @@ int main(int argc, const char** argv) {
 	std::vector<vkcv::Image> sceneImages;
 
 	for (const auto& material : scene.materials) {
-		int baseColorIndex = material.baseColor;
-		if (baseColorIndex < 0) {
-			vkcv_log(vkcv::LogLevel::WARNING, "Material lacks base color");
-			baseColorIndex = 0;
+		int albedoIndex     = material.baseColor;
+		int normalIndex     = material.normal;
+		int specularIndex   = material.metalRough;
+
+		if (albedoIndex < 0) {
+			vkcv_log(vkcv::LogLevel::WARNING, "Material lacks albedo");
+			albedoIndex = 0;
+		}
+		if (normalIndex < 0) {
+			vkcv_log(vkcv::LogLevel::WARNING, "Material lacks normal");
+			normalIndex = 0;
+		}
+		if (specularIndex < 0) {
+			vkcv_log(vkcv::LogLevel::WARNING, "Material lacks specular");
+			specularIndex = 0;
 		}
 
 		materialDescriptorSets.push_back(core.createDescriptorSet(forwardProgram.getReflectedDescriptors()[1]));
 
-		vkcv::asset::Texture& sceneTexture = scene.textures[baseColorIndex];
+		vkcv::asset::Texture& albedoTexture     = scene.textures[albedoIndex];
+		vkcv::asset::Texture& normalTexture     = scene.textures[normalIndex];
+		vkcv::asset::Texture& specularTexture   = scene.textures[specularIndex];
+
+		// albedo texture
+		sceneImages.push_back(core.createImage(vk::Format::eR8G8B8A8Srgb, albedoTexture.w, albedoTexture.h, 1, true));
+		sceneImages.back().fill(albedoTexture.data.data());
+		sceneImages.back().generateMipChainImmediate();
+		sceneImages.back().switchLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
+		const vkcv::ImageHandle albedoHandle = sceneImages.back().getHandle();
+
+		// normal texture
+		sceneImages.push_back(core.createImage(vk::Format::eR8G8B8A8Srgb, normalTexture.w, normalTexture.h, 1, true));
+		sceneImages.back().fill(normalTexture.data.data());
+		sceneImages.back().generateMipChainImmediate();
+		sceneImages.back().switchLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
+		const vkcv::ImageHandle normalHandle = sceneImages.back().getHandle();
 
-		sceneImages.push_back(core.createImage(vk::Format::eR8G8B8A8Srgb, sceneTexture.w, sceneTexture.h, 1, true));
-		sceneImages.back().fill(sceneTexture.data.data());
+		// specular texture
+		sceneImages.push_back(core.createImage(vk::Format::eR8G8B8A8Srgb, specularTexture.w, specularTexture.h, 1, true));
+		sceneImages.back().fill(specularTexture.data.data());
 		sceneImages.back().generateMipChainImmediate();
 		sceneImages.back().switchLayout(vk::ImageLayout::eShaderReadOnlyOptimal);
+		const vkcv::ImageHandle specularHandle = sceneImages.back().getHandle();
 
 		vkcv::DescriptorWrites setWrites;
 		setWrites.sampledImageWrites = {
-			vkcv::SampledImageDescriptorWrite(0, sceneImages.back().getHandle())
+			vkcv::SampledImageDescriptorWrite(0, albedoHandle),
+			vkcv::SampledImageDescriptorWrite(2, normalHandle),
+			vkcv::SampledImageDescriptorWrite(3, specularHandle)
 		};
 		setWrites.samplerWrites = {
 			vkcv::SamplerDescriptorWrite(1, colorSampler),
-- 
GitLab