parent
							
								
									11610c6a6b
								
							
						
					
					
						commit
						7d36d173f6
					
				| 
						 | 
					@ -199,7 +199,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
	// load skins from glTF model
 | 
						// load skins from glTF model
 | 
				
			||||||
	void VulkanglTFModel::loadSkins(tinygltf::Model& input)
 | 
						void VulkanglTFModel::loadSkins(tinygltf::Model& input)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
| 
						 | 
					@ -249,7 +249,7 @@
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	}
 | 
						}*/
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	//glTF nodes loading helper function
 | 
						//glTF nodes loading helper function
 | 
				
			||||||
	//rewrite node loader,simplify logic
 | 
						//rewrite node loader,simplify logic
 | 
				
			||||||
| 
						 | 
					@ -755,7 +755,7 @@ void VulkanExample::setupFrameBuffer()
 | 
				
			||||||
	samplerCI.minLod = 0.0f;
 | 
						samplerCI.minLod = 0.0f;
 | 
				
			||||||
	samplerCI.maxLod = 1.0f;
 | 
						samplerCI.maxLod = 1.0f;
 | 
				
			||||||
	samplerCI.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
 | 
						samplerCI.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
 | 
				
			||||||
 | 
						VK_CHECK_RESULT(vkCreateSampler(device, &samplerCI, nullptr, &colorSampler));
 | 
				
			||||||
	if (tonemappingDescriptorSet != VK_NULL_HANDLE)
 | 
						if (tonemappingDescriptorSet != VK_NULL_HANDLE)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		auto imageInfo = vks::initializers::descriptorImageInfo(colorSampler, pbrFrameBuffer.color.imageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
 | 
							auto imageInfo = vks::initializers::descriptorImageInfo(colorSampler, pbrFrameBuffer.color.imageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
 | 
				
			||||||
| 
						 | 
					@ -780,11 +780,11 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		VkClearValue clearValues[2];
 | 
							VkClearValue clearValues[2];
 | 
				
			||||||
		clearValues[0].color = defaultClearColor;
 | 
							clearValues[0].color = defaultClearColor;
 | 
				
			||||||
		clearValues[0].color = { { 0.25f, 0.25f, 0.25f, 1.0f } };;
 | 
							clearValues[0].color = { { 0.25f, 0.25f, 0.25f, 1.0f } };
 | 
				
			||||||
		clearValues[1].depthStencil = { 1.0f, 0 };
 | 
							clearValues[1].depthStencil = { 1.0f, 0 };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		VkRenderPassBeginInfo renderPassBeginInfo = vks::initializers::renderPassBeginInfo();
 | 
							VkRenderPassBeginInfo renderPassBeginInfo = vks::initializers::renderPassBeginInfo();
 | 
				
			||||||
		renderPassBeginInfo.renderPass = renderPass;
 | 
							renderPassBeginInfo.renderPass = pbrFrameBuffer.fbo.renderPass;
 | 
				
			||||||
		renderPassBeginInfo.renderArea.offset.x = 0;
 | 
							renderPassBeginInfo.renderArea.offset.x = 0;
 | 
				
			||||||
		renderPassBeginInfo.renderArea.offset.y = 0;
 | 
							renderPassBeginInfo.renderArea.offset.y = 0;
 | 
				
			||||||
		renderPassBeginInfo.renderArea.extent.width = width;
 | 
							renderPassBeginInfo.renderArea.extent.width = width;
 | 
				
			||||||
| 
						 | 
					@ -797,20 +797,19 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (int32_t i = 0; i < drawCmdBuffers.size(); ++i)
 | 
							for (int32_t i = 0; i < drawCmdBuffers.size(); ++i)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			renderPassBeginInfo.framebuffer = frameBuffers[i];
 | 
								renderPassBeginInfo.framebuffer = pbrFrameBuffer.fbo.frameBuffer;
 | 
				
			||||||
			VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo));
 | 
								VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo));
 | 
				
			||||||
			vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
 | 
								vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
 | 
				
			||||||
			vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
 | 
								vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
 | 
				
			||||||
			vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor);
 | 
								vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor);
 | 
				
			||||||
			// Bind scene matrices descriptor to set 0
 | 
								// Bind scene matrices descriptor to set 0
 | 
				
			||||||
			vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, nullptr);
 | 
								vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.pbrLayout, 0, 1, &descriptorSet, 0, nullptr);
 | 
				
			||||||
 | 
								vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.pbrLayout, 6, 1, &skinDescriptorSet, 0, nullptr);
 | 
				
			||||||
			vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, wireframe ? pipelines.wireframe : pipelines.solid);
 | 
								vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, wireframe ? pipelines.wireframe : pipelines.solid);
 | 
				
			||||||
			glTFModel.draw(drawCmdBuffers[i], pipelineLayout);
 | 
								glTFModel.draw(drawCmdBuffers[i], pipelineLayouts.pbrLayout);
 | 
				
			||||||
			drawUI(drawCmdBuffers[i]);
 | 
					 | 
				
			||||||
			vkCmdEndRenderPass(drawCmdBuffers[i]);
 | 
								vkCmdEndRenderPass(drawCmdBuffers[i]);
 | 
				
			||||||
			VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i]));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
			//tonemapping render pass
 | 
								{
 | 
				
			||||||
				VkRenderPassBeginInfo renderPassBeginInfo = vks::initializers::renderPassBeginInfo();
 | 
									VkRenderPassBeginInfo renderPassBeginInfo = vks::initializers::renderPassBeginInfo();
 | 
				
			||||||
				renderPassBeginInfo.renderPass = renderPass;
 | 
									renderPassBeginInfo.renderPass = renderPass;
 | 
				
			||||||
				renderPassBeginInfo.framebuffer = VulkanExampleBase::frameBuffers[i];
 | 
									renderPassBeginInfo.framebuffer = VulkanExampleBase::frameBuffers[i];
 | 
				
			||||||
| 
						 | 
					@ -828,9 +827,11 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
				drawUI(drawCmdBuffers[i]);
 | 
									drawUI(drawCmdBuffers[i]);
 | 
				
			||||||
				vkCmdEndRenderPass(drawCmdBuffers[i]);
 | 
									vkCmdEndRenderPass(drawCmdBuffers[i]);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i]));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	void VulkanExample::loadglTFFile(std::string filename, VulkanglTFModel& model, bool bSkyboxFlag = false)
 | 
						void VulkanExample::loadglTFFile(std::string filename, VulkanglTFModel& model, bool bSkyboxFlag)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		tinygltf::Model glTFInput;
 | 
							tinygltf::Model glTFInput;
 | 
				
			||||||
		tinygltf::TinyGLTF gltfContext;
 | 
							tinygltf::TinyGLTF gltfContext;
 | 
				
			||||||
| 
						 | 
					@ -838,49 +839,31 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		this->device = device;
 | 
							this->device = device;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(__ANDROID__)
 | 
				
			||||||
 | 
							// On Android all assets are packed with the apk in a compressed form, so we need to open them using the asset manager
 | 
				
			||||||
 | 
							// We let tinygltf handle this, by passing the asset manager of our app
 | 
				
			||||||
 | 
							tinygltf::asset_manager = androidApp->activity->assetManager;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
		bool fileLoaded = gltfContext.LoadASCIIFromFile(&glTFInput, &error, &warning, filename);
 | 
							bool fileLoaded = gltfContext.LoadASCIIFromFile(&glTFInput, &error, &warning, filename);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Pass some Vulkan resources required for setup and rendering to the glTF model loading class
 | 
							// Pass some Vulkan resources required for setup and rendering to the glTF model loading class
 | 
				
			||||||
		glTFModel.vulkanDevice = vulkanDevice;
 | 
							model.vulkanDevice = vulkanDevice;
 | 
				
			||||||
		glTFModel.copyQueue = queue;
 | 
							model.copyQueue = queue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		std::vector<uint32_t> indexBuffer;
 | 
							std::vector<uint32_t> indexBuffer;
 | 
				
			||||||
		std::vector<VulkanglTFModel::Vertex> vertexBuffer;
 | 
							std::vector<VulkanglTFModel::Vertex> vertexBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (fileLoaded) 
 | 
							if (fileLoaded) {
 | 
				
			||||||
		{
 | 
								model.nodeCount = static_cast<uint32_t>(glTFInput.nodes.size());
 | 
				
			||||||
			glTFModel.nodeCount = static_cast<uint32_t>(glTFInput.nodes.size());
 | 
								model.loadImages(glTFInput);
 | 
				
			||||||
			glTFModel.loadImages(glTFInput);
 | 
								model.loadMaterials(glTFInput);
 | 
				
			||||||
			glTFModel.loadMaterials(glTFInput);
 | 
								model.loadTextures(glTFInput);
 | 
				
			||||||
			glTFModel.loadTextures(glTFInput);
 | 
					 | 
				
			||||||
			//glTFModel.loadSkins(glTFInput);
 | 
					 | 
				
			||||||
			const tinygltf::Scene& scene = glTFInput.scenes[0];
 | 
								const tinygltf::Scene& scene = glTFInput.scenes[0];
 | 
				
			||||||
			for (size_t i = 0; i < scene.nodes.size(); i++) {
 | 
								for (size_t i = 0; i < scene.nodes.size(); i++) {
 | 
				
			||||||
				const tinygltf::Node node = glTFInput.nodes[scene.nodes[i]];
 | 
									const tinygltf::Node node = glTFInput.nodes[scene.nodes[i]];
 | 
				
			||||||
				glTFModel.loadNode(node, glTFInput, nullptr,scene.nodes[i], indexBuffer, vertexBuffer);
 | 
									model.loadNode(node, glTFInput, nullptr, scene.nodes[i], indexBuffer, vertexBuffer);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			
 | 
								model.loadAnimations(glTFInput);
 | 
				
			||||||
			glTFModel.loadAnimations(glTFInput);
 | 
					 | 
				
			||||||
			// update joint in nodes
 | 
					 | 
				
			||||||
			/*
 | 
					 | 
				
			||||||
			
 | 
					 | 
				
			||||||
			for (auto node : glTFModel.nodes)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				
 | 
					 | 
				
			||||||
				glTFModel.updateJoints(node);
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			for (size_t i = 0; i < glTFModel.nodes.size(); i++)
 | 
					 | 
				
			||||||
			{
 | 
					 | 
				
			||||||
				if (glTFModel.nodes[i]->skin > -1)
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					glTFModel.updateJoints(glTFModel.nodes[i]);
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
				else
 | 
					 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					continue;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}*/
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else {
 | 
							else {
 | 
				
			||||||
			vks::tools::exitFatal("Could not open the glTF file.\n\nThe file is part of the additional asset pack.\n\nRun \"download_assets.py\" in the repository root to download the latest version.", -1);
 | 
								vks::tools::exitFatal("Could not open the glTF file.\n\nThe file is part of the additional asset pack.\n\nRun \"download_assets.py\" in the repository root to download the latest version.", -1);
 | 
				
			||||||
| 
						 | 
					@ -893,9 +876,12 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		size_t vertexBufferSize = vertexBuffer.size() * sizeof(VulkanglTFModel::Vertex);
 | 
							size_t vertexBufferSize = vertexBuffer.size() * sizeof(VulkanglTFModel::Vertex);
 | 
				
			||||||
		size_t indexBufferSize = indexBuffer.size() * sizeof(uint32_t);
 | 
							size_t indexBufferSize = indexBuffer.size() * sizeof(uint32_t);
 | 
				
			||||||
		glTFModel.indices.count = static_cast<uint32_t>(indexBuffer.size());
 | 
							model.indices.count = static_cast<uint32_t>(indexBuffer.size());
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							struct StagingBuffer {
 | 
				
			||||||
 | 
								VkBuffer buffer;
 | 
				
			||||||
 | 
								VkDeviceMemory memory;
 | 
				
			||||||
 | 
							} vertexStaging, indexStaging;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Create host visible staging buffers (source)
 | 
							// Create host visible staging buffers (source)
 | 
				
			||||||
		VK_CHECK_RESULT(vulkanDevice->createBuffer(
 | 
							VK_CHECK_RESULT(vulkanDevice->createBuffer(
 | 
				
			||||||
| 
						 | 
					@ -919,15 +905,14 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
			VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
 | 
								VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
 | 
				
			||||||
			VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
 | 
								VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
 | 
				
			||||||
			vertexBufferSize,
 | 
								vertexBufferSize,
 | 
				
			||||||
			&glTFModel.vertices.buffer,
 | 
								&model.vertices.buffer,
 | 
				
			||||||
			&glTFModel.vertices.memory));
 | 
								&model.vertices.memory));
 | 
				
			||||||
 | 
					 | 
				
			||||||
		VK_CHECK_RESULT(vulkanDevice->createBuffer(
 | 
							VK_CHECK_RESULT(vulkanDevice->createBuffer(
 | 
				
			||||||
			VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
 | 
								VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT,
 | 
				
			||||||
			VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
 | 
								VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
 | 
				
			||||||
			indexBufferSize,
 | 
								indexBufferSize,
 | 
				
			||||||
			&glTFModel.indices.buffer,
 | 
								&model.indices.buffer,
 | 
				
			||||||
			&glTFModel.indices.memory));
 | 
								&model.indices.memory));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Copy data from staging buffers (host) do device local buffer (gpu)
 | 
							// Copy data from staging buffers (host) do device local buffer (gpu)
 | 
				
			||||||
		VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
 | 
							VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true);
 | 
				
			||||||
| 
						 | 
					@ -937,16 +922,15 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
		vkCmdCopyBuffer(
 | 
							vkCmdCopyBuffer(
 | 
				
			||||||
			copyCmd,
 | 
								copyCmd,
 | 
				
			||||||
			vertexStaging.buffer,
 | 
								vertexStaging.buffer,
 | 
				
			||||||
			glTFModel.vertices.buffer,
 | 
								model.vertices.buffer,
 | 
				
			||||||
			1,
 | 
								1,
 | 
				
			||||||
			©Region);
 | 
								©Region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		copyRegion.size = indexBufferSize;
 | 
							copyRegion.size = indexBufferSize;
 | 
				
			||||||
 | 
					 | 
				
			||||||
		vkCmdCopyBuffer(
 | 
							vkCmdCopyBuffer(
 | 
				
			||||||
			copyCmd,
 | 
								copyCmd,
 | 
				
			||||||
			indexStaging.buffer,
 | 
								indexStaging.buffer,
 | 
				
			||||||
			glTFModel.indices.buffer,
 | 
								model.indices.buffer,
 | 
				
			||||||
			1,
 | 
								1,
 | 
				
			||||||
			©Region);
 | 
								©Region);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -985,9 +969,8 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
		vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1)
 | 
							vks::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
 | 
							// One set for matrices and one per model image/texture
 | 
				
			||||||
		const uint32_t maxSetCount = static_cast<uint32_t>(glTFModel.images.size()) + 6;
 | 
							const uint32_t maxSetCount = static_cast<uint32_t>(glTFModel.images.size()) + 6;
 | 
				
			||||||
		// Number of descriptor sets = One for the scene ubo + one per image + one per skin
 | 
					 | 
				
			||||||
		//const uint32_t             maxSetCount = static_cast<uint32_t>(glTFModel.images.size()) + static_cast<uint32_t>(glTFModel.skins.size()) + 1+ 6 ;
 | 
					 | 
				
			||||||
		VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(poolSizes, maxSetCount);
 | 
							VkDescriptorPoolCreateInfo descriptorPoolInfo = vks::initializers::descriptorPoolCreateInfo(poolSizes, maxSetCount);
 | 
				
			||||||
		VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
 | 
							VK_CHECK_RESULT(vkCreateDescriptorPool(device, &descriptorPoolInfo, nullptr, &descriptorPool));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1000,17 +983,17 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
			vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 3),
 | 
								vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 3),
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
 | 
							VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(setLayoutBindings);
 | 
				
			||||||
		// Descriptor set layout for passing matrices
 | 
					 | 
				
			||||||
		VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.matrices));
 | 
							VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.matrices));
 | 
				
			||||||
		// Descriptor set layout for material uniform buffer
 | 
					
 | 
				
			||||||
		VkDescriptorSetLayoutBinding materialBufferLayoutBinding = vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_FRAGMENT_BIT, 0);
 | 
							VkDescriptorSetLayoutBinding materialBufferLayoutBinding = vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, VK_SHADER_STAGE_FRAGMENT_BIT, 0);
 | 
				
			||||||
		descriptorSetLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(&materialBufferLayoutBinding, 1);
 | 
							descriptorSetLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(&materialBufferLayoutBinding, 1);
 | 
				
			||||||
		VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.materialUniform));
 | 
							VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.materialUniform));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Descriptor set layout for passing material textures
 | 
							// Descriptor set layout for passing material textures
 | 
				
			||||||
		VkDescriptorSetLayoutBinding setLayoutBinding = vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 0);
 | 
							VkDescriptorSetLayoutBinding setLayoutBinding = vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, VK_SHADER_STAGE_FRAGMENT_BIT, 0);
 | 
				
			||||||
		descriptorSetLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(&setLayoutBinding, 1);
 | 
							descriptorSetLayoutCI = vks::initializers::descriptorSetLayoutCreateInfo(&setLayoutBinding, 1);
 | 
				
			||||||
		VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.textures));
 | 
							VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.textures));
 | 
				
			||||||
		// Descriptor set layout for ssbo
 | 
					
 | 
				
			||||||
		setLayoutBinding = vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0);
 | 
							setLayoutBinding = vks::initializers::descriptorSetLayoutBinding(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, VK_SHADER_STAGE_VERTEX_BIT, 0);
 | 
				
			||||||
		VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.ssbo));
 | 
							VK_CHECK_RESULT(vkCreateDescriptorSetLayout(device, &descriptorSetLayoutCI, nullptr, &descriptorSetLayouts.ssbo));
 | 
				
			||||||
		// Descriptor set layout for passing skin joint matrices
 | 
							// Descriptor set layout for passing skin joint matrices
 | 
				
			||||||
| 
						 | 
					@ -1033,7 +1016,7 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
			descriptorSetLayouts.ssbo,
 | 
								descriptorSetLayouts.ssbo,
 | 
				
			||||||
		};
 | 
							};
 | 
				
			||||||
		VkPipelineLayoutCreateInfo pipelineLayoutCI = vks::initializers::pipelineLayoutCreateInfo(setLayouts.data(), static_cast<uint32_t>(setLayouts.size()));
 | 
							VkPipelineLayoutCreateInfo pipelineLayoutCI = vks::initializers::pipelineLayoutCreateInfo(setLayouts.data(), static_cast<uint32_t>(setLayouts.size()));
 | 
				
			||||||
		VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCI, nullptr, &pipelineLayout));
 | 
							VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCI, nullptr, &pipelineLayouts.pbrLayout));
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		// We will use push constants to push the local matrices of a primitive to the vertex shader
 | 
							// We will use push constants to push the local matrices of a primitive to the vertex shader
 | 
				
			||||||
| 
						 | 
					@ -1057,6 +1040,7 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
		vkUpdateDescriptorSets(device, 4, writeDescriptorSets.data(), 0, nullptr);
 | 
							vkUpdateDescriptorSets(device, 4, writeDescriptorSets.data(), 0, nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// Descriptor set for glTF model skin joint matrices
 | 
							// Descriptor set for glTF model skin joint matrices
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
		 if (glTFModel.skins.size() > 0)
 | 
							 if (glTFModel.skins.size() > 0)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			for (auto& skin : glTFModel.skins)
 | 
								for (auto& skin : glTFModel.skins)
 | 
				
			||||||
| 
						 | 
					@ -1068,13 +1052,7 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
		{
 | 
							*/
 | 
				
			||||||
			const VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayouts.ssbo, 1);
 | 
					 | 
				
			||||||
			VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &skinDescriptorSet));
 | 
					 | 
				
			||||||
			VkWriteDescriptorSet writeDescriptorSet = vks::initializers::writeDescriptorSet(skinDescriptorSet, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 0, &shaderData.skinSSBO.descriptor);
 | 
					 | 
				
			||||||
			vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, nullptr);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		
 | 
					 | 
				
			||||||
		
 | 
							
 | 
				
			||||||
		for (auto& material : glTFModel.materials)
 | 
							for (auto& material : glTFModel.materials)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					@ -1092,16 +1070,22 @@ void VulkanExample::getEnabledFeatures()
 | 
				
			||||||
			VkWriteDescriptorSet writeDescriptorSet = vks::initializers::writeDescriptorSet(image.descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &image.texture.descriptor);
 | 
								VkWriteDescriptorSet writeDescriptorSet = vks::initializers::writeDescriptorSet(image.descriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &image.texture.descriptor);
 | 
				
			||||||
			vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, nullptr);
 | 
								vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, nullptr);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					 | 
				
			||||||
		//tonemapping pipline layout
 | 
					 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			VkPipelineLayoutCreateInfo piplineLayoutCI = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayouts.textures, 1);
 | 
								const VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayouts.ssbo, 1);
 | 
				
			||||||
			VK_CHECK_RESULT(vkCreatePipelineLayout(device, &piplineLayoutCI, nullptr, &pipelineLayouts.tonemappingLayout));
 | 
								VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &skinDescriptorSet));
 | 
				
			||||||
 | 
								VkWriteDescriptorSet writeDescriptorSet = vks::initializers::writeDescriptorSet(skinDescriptorSet, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 0, &shaderData.skinSSBO.descriptor);
 | 
				
			||||||
 | 
								vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, nullptr);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							//Tone Mapping pipeline layout
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								auto pipelineLayoutCI = vks::initializers::pipelineLayoutCreateInfo(&descriptorSetLayouts.textures, 1);
 | 
				
			||||||
 | 
								VK_CHECK_RESULT(vkCreatePipelineLayout(device, &pipelineLayoutCI, nullptr, &pipelineLayouts.tonemappingLayout));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			const VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayouts.textures, 1);
 | 
								const VkDescriptorSetAllocateInfo allocInfo = vks::initializers::descriptorSetAllocateInfo(descriptorPool, &descriptorSetLayouts.textures, 1);
 | 
				
			||||||
			VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &tonemappingDescriptorSet));
 | 
								VK_CHECK_RESULT(vkAllocateDescriptorSets(device, &allocInfo, &tonemappingDescriptorSet));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			VkDescriptorImageInfo imageInfo = vks::initializers::descriptorImageInfo(colorSampler, pbrFrameBuffer.color.imageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
 | 
								auto imageInfo = vks::initializers::descriptorImageInfo(colorSampler, pbrFrameBuffer.color.imageView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
 | 
				
			||||||
			VkWriteDescriptorSet writeDescriptorSet = vks::initializers::writeDescriptorSet(tonemappingDescriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &imageInfo);
 | 
								VkWriteDescriptorSet writeDescriptorSet = vks::initializers::writeDescriptorSet(tonemappingDescriptorSet, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 0, &imageInfo);
 | 
				
			||||||
			vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, nullptr);
 | 
								vkUpdateDescriptorSets(device, 1, &writeDescriptorSet, 0, nullptr);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue