Code cleanup, comments

This commit is contained in:
saschawillems 2017-12-23 14:14:38 +01:00
parent 1b1bb4cbd2
commit 8b4ab74220

View file

@ -215,6 +215,52 @@ public:
enabledFeatures.depthClamp = deviceFeatures.depthClamp; enabledFeatures.depthClamp = deviceFeatures.depthClamp;
} }
/*
Render the example scene with given command buffer, pipeline layout and dscriptor set
Used by the scene rendering and depth pass generation command buffer
*/
void renderScene(VkCommandBuffer commandBuffer, VkPipelineLayout pipelineLayout, VkDescriptorSet descriptorSet, uint32_t cascadeIndex = 0) {
const VkDeviceSize offsets[1] = { 0 };
PushConstBlock pushConstBlock = { glm::vec4(0.0f), cascadeIndex };
std::array<VkDescriptorSet, 2> sets;
sets[0] = descriptorSet;
// Floor
sets[1] = materials[0].descriptorSet;
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 2, sets.data(), 0, NULL);
vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstBlock), &pushConstBlock);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &models[0].vertices.buffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, models[0].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(commandBuffer, models[0].indexCount, 1, 0, 0, 0);
// Trees
const std::vector<glm::vec3> positions = {
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(1.25f, 0.25f, 1.25f),
glm::vec3(-1.25f, -0.2f, 1.25f),
glm::vec3(1.25f, 0.1f, -1.25f),
glm::vec3(-1.25f, -0.25f, -1.25f),
};
for (auto position : positions) {
pushConstBlock.position = glm::vec4(position, 0.0f);
vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstBlock), &pushConstBlock);
sets[1] = materials[1].descriptorSet;
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 2, sets.data(), 0, NULL);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &models[1].vertices.buffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, models[1].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(commandBuffer, models[1].indexCount, 1, 0, 0, 0);
sets[1] = materials[2].descriptorSet;
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 2, sets.data(), 0, NULL);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &models[2].vertices.buffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, models[2].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(commandBuffer, models[2].indexCount, 1, 0, 0, 0);
}
}
/* /*
Setup resources used by the depth pass Setup resources used by the depth pass
The depth image is layered with each layer storing one shadow map cascade The depth image is layered with each layer storing one shadow map cascade
@ -320,6 +366,7 @@ public:
// One image and framebuffer per cascade // One image and framebuffer per cascade
for (uint32_t i = 0; i < SHADOW_MAP_CASCADE_COUNT; i++) { for (uint32_t i = 0; i < SHADOW_MAP_CASCADE_COUNT; i++) {
// Image view for this cascade's layer (inside the depth map) // Image view for this cascade's layer (inside the depth map)
// This view is used to render to that specific depth image layer
VkImageViewCreateInfo viewInfo = vks::initializers::imageViewCreateInfo(); VkImageViewCreateInfo viewInfo = vks::initializers::imageViewCreateInfo();
viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY;
viewInfo.format = depthFormat; viewInfo.format = depthFormat;
@ -358,49 +405,12 @@ public:
VK_CHECK_RESULT(vkCreateSampler(device, &sampler, nullptr, &depth.sampler)); VK_CHECK_RESULT(vkCreateSampler(device, &sampler, nullptr, &depth.sampler));
} }
void renderScene(VkCommandBuffer commandBuffer, VkPipelineLayout pipelineLayout, VkDescriptorSet descriptorSet, uint32_t cascadeIndex = 0) { /*
const VkDeviceSize offsets[1] = { 0 }; Build the command buffer for rendering the depth map cascades
PushConstBlock pushConstBlock = { glm::vec4(0.0f), cascadeIndex }; Uses multiple passes with each pass rendering the scene to the cascade's depth image layer
Could be optimized using a geometry shader (and layered frame buffer) on devices that support geometry shaders
std::array<VkDescriptorSet,2> sets; */
sets[0] = descriptorSet; void buildDepthPassCommandBuffer()
// Floor
sets[1] = materials[0].descriptorSet;
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 2, sets.data(), 0, NULL);
vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstBlock), &pushConstBlock);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &models[0].vertices.buffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, models[0].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(commandBuffer, models[0].indexCount, 1, 0, 0, 0);
// Trees
const std::vector<glm::vec3> positions = {
glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(1.25f, 0.25f, 1.25f),
glm::vec3(-1.25f, -0.2f, 1.25f),
glm::vec3(1.25f, 0.1f, -1.25f),
glm::vec3(-1.25f, -0.25f, -1.25f),
};
for (auto position : positions) {
pushConstBlock.position = glm::vec4(position, 0.0f);
vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstBlock), &pushConstBlock);
sets[1] = materials[1].descriptorSet;
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 2, sets.data(), 0, NULL);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &models[1].vertices.buffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, models[1].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(commandBuffer, models[1].indexCount, 1, 0, 0, 0);
sets[1] = materials[2].descriptorSet;
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 2, sets.data(), 0, NULL);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &models[2].vertices.buffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, models[2].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(commandBuffer, models[2].indexCount, 1, 0, 0, 0);
}
}
void buildOffscreenCommandBuffer()
{ {
VkCommandBufferBeginInfo cmdBufInfo = vks::initializers::commandBufferBeginInfo(); VkCommandBufferBeginInfo cmdBufInfo = vks::initializers::commandBufferBeginInfo();
@ -424,8 +434,8 @@ public:
VkRect2D scissor = vks::initializers::rect2D(SHADOWMAP_DIM, SHADOWMAP_DIM, 0, 0); VkRect2D scissor = vks::initializers::rect2D(SHADOWMAP_DIM, SHADOWMAP_DIM, 0, 0);
vkCmdSetScissor(depthPass.commandBuffer, 0, 1, &scissor); vkCmdSetScissor(depthPass.commandBuffer, 0, 1, &scissor);
// Multi-pass depht map cascade generation // One pass per cascade
// Could be simplified to one pass using geometry shaders and layered frame buffers // The layer that this pass renders too is defined by the cascade's image view (selected via the cascade's decsriptor set)
for (uint32_t i = 0; i < SHADOW_MAP_CASCADE_COUNT; i++) { for (uint32_t i = 0; i < SHADOW_MAP_CASCADE_COUNT; i++) {
renderPassBeginInfo.framebuffer = cascades[i].frameBuffer; renderPassBeginInfo.framebuffer = cascades[i].frameBuffer;
vkCmdBeginRenderPass(depthPass.commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE); vkCmdBeginRenderPass(depthPass.commandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
@ -904,7 +914,7 @@ public:
setupLayoutsAndDescriptors(); setupLayoutsAndDescriptors();
preparePipelines(); preparePipelines();
buildCommandBuffers(); buildCommandBuffers();
buildOffscreenCommandBuffer(); buildDepthPassCommandBuffer();
prepared = true; prepared = true;
} }