纹理
本篇介绍VulkanSceneGraph简单的纹理实践,内容实际与vsgExamples中的vsgDraw类似,但另有些许不同。
代码看这里
使用过程
纹理的使用往往有两个过程
- 加载纹理图像
- 将纹理图映射到所需的片元上
加载纹理图
加载纹理
// read texture image
vsg::Path textureFile("textures/container.jpg");
auto textureData = vsg::read_cast<vsg::Data>(vsg::findFile(textureFile, vsg::Paths{ std::string(RESOURCES_DIR)}),options);
if (!textureData)
{
std::cout << "Could not read texture file : " << textureFile << std::endl;
return 1;
}
这里由于使用的是png格式的图片,需要引入vsgXchange配套库,vsg库提供有有限的几种格式的文件读取,但不包括png图片。
#include<vsgXchange/all.h>
...
options->add(vsgXchange::all::create());
纹理映射
这里,结合Vulkan,有几个关键的步骤
- 着色器
- descriptor和graphics pipeline管线设置
- bindDescriptorSet绑定所需的descriptor
着色器部分与其他使用基本相同,此处略过
descriptor和管线设置如下,配置DescriptorSetLayoutBindings和DescriptorSetLayout,最后设置好PipelineLayout即可
// set up graphics pipeline
vsg::DescriptorSetLayoutBindings descriptorBindings{
{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr} // { binding, descriptorType, descriptorCount, stageFlags, pImmutableSamplers}
};
auto descriptorSetLayout = vsg::DescriptorSetLayout::create(descriptorBindings);
auto pipelineLayout = vsg::PipelineLayout::create(vsg::DescriptorSetLayouts{ descriptorSetLayout }, vsg::PushConstantRanges{});
最后的使用绑定过程
auto descriptorSet = vsg::DescriptorSet::create(descriptorSetLayout, vsg::Descriptors{ texture });
auto bindDescriptorSet = vsg::BindDescriptorSet::create(VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, descriptorSet);
...
// create StateGroup as the root of the scene/command graph to hold the GraphicsPipeline
auto scenegraph = vsg::StateGroup::create();
scenegraph->add(bindGraphicsPipeline);
scenegraph->add(bindDescriptorSet);
VSG可以将该过程绑定到StateGroup节点中,该节点绑定了管线并可以将绘制命令集成到该节点中,次吃就将绑定DescriptorSet的命令作了内部集成,即可在渲染过程中绑定对应的纹理。