Added backgdrop, object and more text to text overlay example

This commit is contained in:
saschawillems 2016-05-07 12:37:12 +02:00
parent 99ad677339
commit b39d589c86
13 changed files with 243 additions and 62 deletions

View file

@ -46,7 +46,7 @@ std::vector<vkMeshLoader::VertexLayout> vertexLayout =
#define STB_NUM_CHARS STB_FONT_consolas_24_latin1_NUM_CHARS
// Max. number of chars the text overlay buffer can hold
#define MAX_CHAR_COUNT 1024
#define MAX_CHAR_COUNT 2048
// Mostly self-contained text overlay class
// todo : comment
@ -106,6 +106,8 @@ public:
enum TextAlign { alignLeft, alignCenter, alignRight };
bool visible = true;
VulkanTextOverlay(
VkPhysicalDevice physicalDevice,
VkDevice device,
@ -675,6 +677,11 @@ public:
// Does a queue wait idle
void submit(VkQueue queue, uint32_t bufferindex)
{
if (!visible)
{
return;
}
VkSubmitInfo submitInfo = {};
submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &cmdBuffers[bufferindex];
@ -691,7 +698,8 @@ public:
VulkanTextOverlay *textOverlay = nullptr;
struct {
vkTools::VulkanTexture colorMap;
vkTools::VulkanTexture background;
vkTools::VulkanTexture cube;
} textures;
struct {
@ -701,7 +709,7 @@ public:
} vertices;
struct {
vkMeshLoader::MeshBuffer example;
vkMeshLoader::MeshBuffer cube;
} meshes;
struct {
@ -711,32 +719,40 @@ public:
struct {
glm::mat4 projection;
glm::mat4 model;
glm::vec4 lightPos = glm::vec4(5.0f, -50.0f, 5.0f, 1.0f);
glm::vec4 lightPos = glm::vec4(0.0f, 0.0f, 0.0f, 1.0f);
} uboVS;
struct {
VkPipeline solid;
VkPipeline background;
} pipelines;
VkPipelineLayout pipelineLayout;
VkDescriptorSet descriptorSet;
VkDescriptorSetLayout descriptorSetLayout;
struct {
VkDescriptorSet background;
VkDescriptorSet cube;
} descriptorSets;
VulkanExample() : VulkanExampleBase(ENABLE_VALIDATION)
{
zoom = -7.5f;
zoom = -4.5f;
zoomSpeed = 2.5f;
rotation = { -5.0f, -35.0f, 0.0f };
rotation = { -25.0f, 0.0f, 0.0f };
title = "Vulkan Example - Text overlay";
}
~VulkanExample()
{
vkDestroyPipeline(device, pipelines.solid, nullptr);
vkDestroyPipeline(device, pipelines.background, nullptr);
vkDestroyPipelineLayout(device, pipelineLayout, nullptr);
vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr);
vkMeshLoader::freeMeshBufferResources(device, &meshes.example);
textureLoader->destroyTexture(textures.colorMap);
vkMeshLoader::freeMeshBufferResources(device, &meshes.cube);
textureLoader->destroyTexture(textures.background);
textureLoader->destroyTexture(textures.cube);
vkTools::destroyUniformData(device, &uniformData.vsScene);
delete(textOverlay);
}
@ -772,13 +788,21 @@ public:
VkRect2D scissor = vkTools::initializers::rect2D(width, height, 0, 0);
vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor);
vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL);
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.solid);
vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.background, 0, NULL);
VkDeviceSize offsets[1] = { 0 };
vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.example.vertices.buf, offsets);
vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.example.indices.buf, 0, VK_INDEX_TYPE_UINT32);
vkCmdDrawIndexed(drawCmdBuffers[i], meshes.example.indexCount, 1, 0, 0, 0);
vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.cube.vertices.buf, offsets);
vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.cube.indices.buf, 0, VK_INDEX_TYPE_UINT32);
// Background
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.background);
// Vertices are generated by the vertex shader
vkCmdDraw(drawCmdBuffers[i], 4, 1, 0, 0);
// Cube
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.solid);
vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.cube, 0, NULL);
vkCmdDrawIndexed(drawCmdBuffers[i], meshes.cube.indexCount, 1, 0, 0, 0);
vkCmdEndRenderPass(drawCmdBuffers[i]);
@ -794,18 +818,47 @@ public:
textOverlay->beginTextUpdate();
textOverlay->addText(title, 5.0f, 5.0f, VulkanTextOverlay::alignLeft);
textOverlay->addText(deviceProperties.deviceName, 5.0f, 30.0f, VulkanTextOverlay::alignLeft);
std::stringstream ss;
ss << std::fixed << std::setprecision(2) << (frameTimer * 1000.0f) << "ms (" << lastFPS << " fps)";
textOverlay->addText(ss.str(), width, 5.0f, VulkanTextOverlay::alignRight);
textOverlay->addText(ss.str(), 5.0f, 25.0f, VulkanTextOverlay::alignLeft);
textOverlay->addText(deviceProperties.deviceName, 5.0f, 45.0f, VulkanTextOverlay::alignLeft);
textOverlay->addText("Press \"space\" to toggle text overlay", 5.0f, height - 20.0f, VulkanTextOverlay::alignLeft);
// Display projected cube vertices
for (int32_t x = -1; x <= 1; x += 2)
{
for (int32_t y = -1; y <= 1; y += 2)
{
for (int32_t z = -1; z <= 1; z += 2)
{
glm::vec3 projected = glm::project(glm::vec3((float)x, (float)z, (float)y), uboVS.model, uboVS.projection, glm::vec4(0, 0, (float)width, (float)height));
textOverlay->addText(std::to_string(x) + "/" + std::to_string(y), projected.x, projected.y, VulkanTextOverlay::alignCenter);
}
}
}
// Display current model view matrix
textOverlay->addText("model view matrix", width, 5.0f, VulkanTextOverlay::alignRight);
for (uint32_t i = 0; i < 4; i++)
{
ss.str("");
ss << std::fixed << std::setprecision(2) << std::showpos;
ss << uboVS.model[0][i] << " " << uboVS.model[1][i] << " " << uboVS.model[2][i] << " " << uboVS.model[3][i];
textOverlay->addText(ss.str(), width, 25.0f + (float)i * 20.0f, VulkanTextOverlay::alignRight);
}
// Put some text on top of object
// Project object position into screen space
glm::vec3 projected = glm::project(glm::vec3(0.0f), uboVS.model, uboVS.projection, glm::vec4(0, 0, (float)width, (float)height));
textOverlay->addText("Uniform cube", projected.x, projected.y, VulkanTextOverlay::alignCenter);
textOverlay->addText("Look ma I'm a teapot!", projected.x, projected.y, VulkanTextOverlay::alignCenter);
#if defined(__ANDROID__)
// toto
#else
textOverlay->addText("Hold middle mouse button and drag to move", 5.0f, height - 40.0f, VulkanTextOverlay::alignLeft);
#endif
textOverlay->endTextUpdate();
}
@ -835,15 +888,13 @@ public:
void loadTextures()
{
textureLoader->loadTexture(
getAssetPath() + "textures/crate_bc3.ktx",
VK_FORMAT_BC3_UNORM_BLOCK,
&textures.colorMap);
textureLoader->loadTexture(getAssetPath() + "textures/skysphere_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, &textures.background);
textureLoader->loadTexture(getAssetPath() + "textures/round_window_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, &textures.cube);
}
void loadMeshes()
{
loadMesh(getAssetPath() + "models/box.obj", &meshes.example, vertexLayout, 0.15f);
loadMesh(getAssetPath() + "models/cube.dae", &meshes.cube, vertexLayout, 1.0f);
}
void setupVertexDescriptions()
@ -896,11 +947,10 @@ public:
void setupDescriptorPool()
{
// Example uses one ubo and one combined image sampler
std::vector<VkDescriptorPoolSize> poolSizes =
{
vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1),
vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1),
vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 2),
vkTools::initializers::descriptorPoolSize(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 2),
};
VkDescriptorPoolCreateInfo descriptorPoolInfo =
@ -951,31 +1001,42 @@ public:
&descriptorSetLayout,
1);
vkTools::checkResult(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSet));
// Background
vkTools::checkResult(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.background));
VkDescriptorImageInfo texDescriptor =
vkTools::initializers::descriptorImageInfo(
textures.colorMap.sampler,
textures.colorMap.view,
textures.background.sampler,
textures.background.view,
VK_IMAGE_LAYOUT_GENERAL);
std::vector<VkWriteDescriptorSet> writeDescriptorSets =
{
// Binding 0 : Vertex shader uniform buffer
std::vector<VkWriteDescriptorSet> writeDescriptorSets;
// Binding 0 : Vertex shader uniform buffer
writeDescriptorSets.push_back(
vkTools::initializers::writeDescriptorSet(
descriptorSet,
descriptorSets.background,
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
0,
&uniformData.vsScene.descriptor),
// Binding 1 : Color map
&uniformData.vsScene.descriptor));
// Binding 1 : Color map
writeDescriptorSets.push_back(
vkTools::initializers::writeDescriptorSet(
descriptorSet,
descriptorSets.background,
VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
1,
&texDescriptor)
};
&texDescriptor));
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
// Cube
vkTools::checkResult(vkAllocateDescriptorSets(device, &allocInfo, &descriptorSets.cube));
texDescriptor.sampler = textures.cube.sampler;
texDescriptor.imageView = textures.cube.view;
writeDescriptorSets[0].dstSet = descriptorSets.cube;
writeDescriptorSets[1].dstSet = descriptorSets.cube;
vkUpdateDescriptorSets(device, writeDescriptorSets.size(), writeDescriptorSets.data(), 0, NULL);
}
void preparePipelines()
@ -989,7 +1050,7 @@ public:
VkPipelineRasterizationStateCreateInfo rasterizationState =
vkTools::initializers::pipelineRasterizationStateCreateInfo(
VK_POLYGON_MODE_FILL,
VK_CULL_MODE_NONE,
VK_CULL_MODE_BACK_BIT,
VK_FRONT_FACE_CLOCKWISE,
0);
@ -1027,8 +1088,7 @@ public:
dynamicStateEnables.size(),
0);
// Solid rendering pipeline
// Load shaders
// Wire frame rendering pipeline
std::array<VkPipelineShaderStageCreateInfo, 2> shaderStages;
shaderStages[0] = loadShader(getAssetPath() + "shaders/textoverlay/mesh.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
@ -1052,6 +1112,17 @@ public:
pipelineCreateInfo.pStages = shaderStages.data();
vkTools::checkResult(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.solid));
// Background rendering pipeline
depthStencilState.depthTestEnable = VK_FALSE;
depthStencilState.depthWriteEnable = VK_FALSE;
rasterizationState.polygonMode = VK_POLYGON_MODE_FILL;
shaderStages[0] = loadShader(getAssetPath() + "shaders/textoverlay/background.vert.spv", VK_SHADER_STAGE_VERTEX_BIT);
shaderStages[1] = loadShader(getAssetPath() + "shaders/textoverlay/background.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT);
vkTools::checkResult(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.background));
}
// Prepare and initialize uniform buffer containing shader uniforms
@ -1147,6 +1218,16 @@ public:
{
updateTextOverlay();
}
virtual void keyPressed(uint32_t keyCode)
{
switch (keyCode)
{
case 0x6B:
case 0x20:
textOverlay->visible = !textOverlay->visible;
}
}
};
VulkanExample *vulkanExample;