save code
This commit is contained in:
+97
-62
@@ -4,6 +4,7 @@
|
||||
|
||||
|
||||
|
||||
|
||||
FaceApp* FaceApp::faceIns = nullptr;
|
||||
|
||||
FaceApp::FaceApp(/* args */)
|
||||
@@ -372,11 +373,11 @@ void FaceApp::setup_descriptor_pool()
|
||||
{
|
||||
VkDescriptorPoolSize descriptor_pool_size{};
|
||||
descriptor_pool_size.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
descriptor_pool_size.descriptorCount = 6;
|
||||
descriptor_pool_size.descriptorCount = 2;
|
||||
|
||||
VkDescriptorPoolSize descriptor_pool_image_size{};
|
||||
descriptor_pool_image_size.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
descriptor_pool_image_size.descriptorCount = 6;
|
||||
descriptor_pool_image_size.descriptorCount = kMaxTexture + 4;
|
||||
|
||||
|
||||
std::vector<VkDescriptorPoolSize> pool_sizes;
|
||||
@@ -388,7 +389,7 @@ void FaceApp::setup_descriptor_pool()
|
||||
descriptor_pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||
descriptor_pool_info.poolSizeCount = pool_sizes.size();
|
||||
descriptor_pool_info.pPoolSizes = pool_sizes.data();
|
||||
descriptor_pool_info.maxSets = 6;
|
||||
descriptor_pool_info.maxSets = kMaxTexture + 4 + 2;
|
||||
|
||||
VK_CHECK(vkCreateDescriptorPool(device, &descriptor_pool_info, nullptr, &descriptor_pool));
|
||||
}
|
||||
@@ -447,66 +448,71 @@ void FaceApp::setup_descriptor_set_layout()
|
||||
|
||||
void FaceApp::setup_descriptor_set()
|
||||
{
|
||||
|
||||
m_descriptor_sets.resize(kMaxTexture);
|
||||
std::vector<VkDescriptorSetLayout> layouts(kMaxTexture, m_descriptorSetLayout);
|
||||
VkDescriptorSetAllocateInfo alloc_info{};
|
||||
alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||
alloc_info.descriptorPool = descriptor_pool;
|
||||
alloc_info.pSetLayouts = &m_descriptorSetLayout;
|
||||
alloc_info.descriptorSetCount = 1;
|
||||
alloc_info.pSetLayouts = layouts.data();
|
||||
alloc_info.descriptorSetCount = m_descriptor_sets.size();
|
||||
VK_CHECK(vkAllocateDescriptorSets(device, &alloc_info, m_descriptor_sets.data()));
|
||||
|
||||
VK_CHECK(vkAllocateDescriptorSets(device, &alloc_info, &m_descriptor_set));
|
||||
|
||||
VkDescriptorBufferInfo buffer_descriptor{};
|
||||
buffer_descriptor.buffer = uniform_buffer_vs;
|
||||
buffer_descriptor.range = VK_WHOLE_SIZE;
|
||||
buffer_descriptor.offset = 0;
|
||||
|
||||
|
||||
VkDescriptorImageInfo image_descriptor;
|
||||
image_descriptor.imageView = tex_demo0.view;
|
||||
image_descriptor.sampler = tex_demo0.sampler;
|
||||
image_descriptor.imageLayout = tex_demo0.image_layout;
|
||||
|
||||
// 第二个纹理描述符 - 假设你的第二个纹理变量名为 tex_demo1
|
||||
VkDescriptorImageInfo image_descriptor1;
|
||||
image_descriptor1.imageView = tex_demo0_ex.view;
|
||||
image_descriptor1.sampler = tex_demo0_ex.sampler;
|
||||
image_descriptor1.imageLayout = tex_demo0_ex.image_layout;
|
||||
|
||||
VkWriteDescriptorSet write_descriptor_set_uniform{};
|
||||
write_descriptor_set_uniform.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write_descriptor_set_uniform.dstSet = m_descriptor_set;
|
||||
write_descriptor_set_uniform.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
write_descriptor_set_uniform.dstBinding = 0;
|
||||
write_descriptor_set_uniform.pBufferInfo = &buffer_descriptor;
|
||||
write_descriptor_set_uniform.descriptorCount = 1;
|
||||
|
||||
|
||||
VkWriteDescriptorSet write_descriptor_set_image{};
|
||||
write_descriptor_set_image.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write_descriptor_set_image.dstSet = m_descriptor_set;
|
||||
write_descriptor_set_image.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
write_descriptor_set_image.dstBinding = 1;
|
||||
write_descriptor_set_image.pImageInfo = &image_descriptor;
|
||||
write_descriptor_set_image.descriptorCount = 1;
|
||||
|
||||
// 添加第二个纹理的写入描述符
|
||||
VkWriteDescriptorSet write_descriptor_set_image1{};
|
||||
write_descriptor_set_image1.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write_descriptor_set_image1.dstSet = m_descriptor_set;
|
||||
write_descriptor_set_image1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
write_descriptor_set_image1.dstBinding = 2; // 绑定到位置2
|
||||
write_descriptor_set_image1.pImageInfo = &image_descriptor1;
|
||||
write_descriptor_set_image1.descriptorCount = 1;
|
||||
|
||||
std::vector<VkWriteDescriptorSet> write_descriptor_sets =
|
||||
for (int i = 0; i < kMaxTexture; ++i)
|
||||
{
|
||||
write_descriptor_set_uniform,
|
||||
write_descriptor_set_image,
|
||||
write_descriptor_set_image1, // 添加第二个纹理
|
||||
};
|
||||
VkDescriptorBufferInfo buffer_descriptor{};
|
||||
buffer_descriptor.buffer = uniform_buffer_vs;
|
||||
buffer_descriptor.range = VK_WHOLE_SIZE;
|
||||
buffer_descriptor.offset = 0;
|
||||
|
||||
vkUpdateDescriptorSets(device, static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL);
|
||||
|
||||
VkDescriptorImageInfo image_descriptor;
|
||||
image_descriptor.imageView = m_texs[i].view;
|
||||
image_descriptor.sampler = m_texs[i].sampler;
|
||||
image_descriptor.imageLayout = m_texs[i].image_layout;
|
||||
|
||||
// 第二个纹理描述符 - 假设你的第二个纹理变量名为 tex_demo1
|
||||
VkDescriptorImageInfo image_descriptor1;
|
||||
image_descriptor1.imageView = m_texs_ex[i].view;
|
||||
image_descriptor1.sampler = m_texs_ex[i].sampler;
|
||||
image_descriptor1.imageLayout = m_texs_ex[i].image_layout;
|
||||
|
||||
VkWriteDescriptorSet write_descriptor_set_uniform{};
|
||||
write_descriptor_set_uniform.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write_descriptor_set_uniform.dstSet = m_descriptor_sets[i];
|
||||
write_descriptor_set_uniform.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||
write_descriptor_set_uniform.dstBinding = 0;
|
||||
write_descriptor_set_uniform.pBufferInfo = &buffer_descriptor;
|
||||
write_descriptor_set_uniform.descriptorCount = 1;
|
||||
|
||||
|
||||
VkWriteDescriptorSet write_descriptor_set_image{};
|
||||
write_descriptor_set_image.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write_descriptor_set_image.dstSet = m_descriptor_sets[i];
|
||||
write_descriptor_set_image.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
write_descriptor_set_image.dstBinding = 1;
|
||||
write_descriptor_set_image.pImageInfo = &image_descriptor;
|
||||
write_descriptor_set_image.descriptorCount = 1;
|
||||
|
||||
// 添加第二个纹理的写入描述符
|
||||
VkWriteDescriptorSet write_descriptor_set_image1{};
|
||||
write_descriptor_set_image1.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||
write_descriptor_set_image1.dstSet = m_descriptor_sets[i];
|
||||
write_descriptor_set_image1.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
|
||||
write_descriptor_set_image1.dstBinding = 2; // 绑定到位置2
|
||||
write_descriptor_set_image1.pImageInfo = &image_descriptor1;
|
||||
write_descriptor_set_image1.descriptorCount = 1;
|
||||
|
||||
std::vector<VkWriteDescriptorSet> write_descriptor_sets =
|
||||
{
|
||||
write_descriptor_set_uniform,
|
||||
write_descriptor_set_image,
|
||||
write_descriptor_set_image1, // 添加第二个纹理
|
||||
};
|
||||
|
||||
vkUpdateDescriptorSets(device, static_cast<uint32_t>(write_descriptor_sets.size()), write_descriptor_sets.data(), 0, NULL);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void FaceApp::render(VkCommandBuffer commandBuffer)
|
||||
@@ -521,10 +527,10 @@ void FaceApp::render(VkCommandBuffer commandBuffer)
|
||||
|
||||
vkCmdPushConstants(commandBuffer, m_pipelineLayout_bg, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float), &myFloatValue);
|
||||
|
||||
vkCmdDraw(commandBuffer, 6, 1, 0, 0);
|
||||
//vkCmdDraw(commandBuffer, 6, 1, 0, 0);
|
||||
|
||||
|
||||
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descriptor_set, 0, NULL);
|
||||
vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_pipelineLayout, 0, 1, &m_descriptor_sets[_curTexIndex], 0, NULL);
|
||||
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, m_graphicsPipeline);
|
||||
|
||||
vkCmdPushConstants(commandBuffer, m_pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float), &myFloatValue);
|
||||
@@ -575,8 +581,13 @@ void FaceApp::initVulkan()
|
||||
Application::initVulkan();
|
||||
createVmaAllocator();
|
||||
LoadOBJ("face_picture_3dmax.obj", obj_vertices, obj_indices);
|
||||
loadTexture("demo0.png", tex_demo0, true);
|
||||
loadTexture("demo0_ex.png", tex_demo0_ex, true);
|
||||
m_texs.resize(kMaxTexture);
|
||||
m_texs_ex.resize(kMaxTexture);
|
||||
for (int i = 0; i < kMaxTexture; ++i)
|
||||
{
|
||||
loadTexture("demo0.png", m_texs[i], true);
|
||||
loadTexture("demo0_ex.png", m_texs_ex[i], true);
|
||||
}
|
||||
|
||||
loadTexture("out.png", tex_bg, false);
|
||||
createVertexBuffer();
|
||||
@@ -604,7 +615,7 @@ void FaceApp::initVulkan()
|
||||
floatArray.push_back(std::stof(token));
|
||||
}
|
||||
|
||||
ReceiveFacePoint(floatArray.data(), floatArray.size() / 3, 480, 480);
|
||||
//ReceiveFacePoint(floatArray.data(), floatArray.size() / 3, 480, 480);
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -972,4 +983,28 @@ void FaceApp::cleanup()
|
||||
//vmaDestroyBuffer(allocator, m_stagingBuffer, m_stagingBufferAllocation);
|
||||
vkDestroyDescriptorSetLayout(device, m_descriptorSetLayout, nullptr);
|
||||
Application::cleanup();
|
||||
}
|
||||
|
||||
|
||||
void FaceApp::SetInitArg(const char* arg)
|
||||
{
|
||||
_initArg = json::parse(arg);
|
||||
|
||||
}
|
||||
|
||||
void FaceApp::changeMotion(Motion& motion)
|
||||
{
|
||||
if (_curMotion.getMotionId() == motion.getMotionId())
|
||||
{
|
||||
return;
|
||||
}
|
||||
_curMotion = _initArg.motion;
|
||||
for (int i = 0; i < _curMotion.png_num; ++i)
|
||||
{
|
||||
string path = _curMotion.type + "/" + _curMotion.technique + "/" + _curMotion.step + "/" + _curMotion.show_type;
|
||||
string path_name = path + "/" + _curMotion.png_name + std::to_string(i) + ".png";
|
||||
loadTexture(path_name, m_texs[i], true);
|
||||
string path_name_ex = path + "/" + _curMotion.png_name + std::to_string(i) + "_thick.png";
|
||||
loadTexture(path_name, m_texs[i], true);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user