Added backgdrop, object and more text to text overlay example
This commit is contained in:
parent
99ad677339
commit
b39d589c86
13 changed files with 243 additions and 62 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue