文檔列表見:Rust 移動端跨平臺複雜圖形渲染項目開發系列總結(目錄)ide
2019.6.11 更新:標題post
Texture都有建立、上傳數據、下載繪製結果數據、做爲Framebuffer的掛載點等操做,下面分別介紹。學習
OpenGL(ES)的Texture對應到Vulkan分別是Image、ImageView、Memory、Sampler,上傳/下載Image的數據還須要配合Buffer,涉及到很是多細節。若是是剛開始學習圖形開發,不建議使用Vulkan。ui
建立紋理的總體流程:編碼
上傳數據到紋理的總體流程:spa
在Shader使用紋理的總體流程:code
下載繪製結果數據的總體流程:orm
待續隊列
做爲Framebuffer掛載點的總體流程:ip
待續
let kind = image::Kind::D2(dims.width as image::Size, dims.height as image::Size, 1 /* Layer */, 1 /* NumSamples */);
let unbound = device.create_image(
kind,
1 /* mip_levels */,
ColorFormat::SELF,
image::Tiling::Optimal,
image::Usage::TRANSFER_DST | image::Usage::SAMPLED,
image::StorageFlags::empty(),
)
.unwrap();
複製代碼
let req = device.get_image_requirements(&unbound);
let device_type = adapter
.memory_types
.iter()
.enumerate()
.position(|(id, memory_type)| {
req.type_mask & (1 << id) != 0 && memory_type.properties.contains(memory::Properties::DEVICE_LOCAL)
})
.unwrap()
.into();
let memory = device.allocate_memory(device_type, req.size).unwrap();
複製代碼
let image = device.bind_image_memory(&memory, 0, unbound).unwrap();
複製代碼
let mut transfered_image_fence = device.create_fence(false);
複製代碼
// copy buffer to texture
{
let submit = {
let mut cmd_buffer = staging_pool.acquire_command_buffer(false);
let image_barrier = memory::Barrier::Image {
states: (image::Access::empty(), image::Layout::Undefined)
..(image::Access::TRANSFER_WRITE, image::Layout::TransferDstOptimal),
target: &image,
range: COLOR_RANGE.clone(),
};
cmd_buffer.pipeline_barrier(
PipelineStage::TOP_OF_PIPE..PipelineStage::TRANSFER,
memory::Dependencies::empty(),
&[image_barrier],
);
cmd_buffer.copy_buffer_to_image(
buffer.as_ref().unwrap().get_buffer(),
&image,
image::Layout::TransferDstOptimal,
&[command::BufferImageCopy {
buffer_offset: 0,
buffer_width: row_pitch / (stride as u32),
buffer_height: dims.height as u32,
image_layers: image::SubresourceLayers {
aspects: f::Aspects::COLOR,
level: 0,
layers: 0..1,
},
image_offset: image::Offset { x: 0, y: 0, z: 0 },
image_extent: image::Extent {
width: dims.width,
height: dims.height,
depth: 1,
},
}],
);
let image_barrier = memory::Barrier::Image {
states: (image::Access::TRANSFER_WRITE, image::Layout::TransferDstOptimal)
..(image::Access::SHADER_READ, image::Layout::ShaderReadOnlyOptimal),
target: &image,
range: COLOR_RANGE.clone(),
};
cmd_buffer.pipeline_barrier(
PipelineStage::TRANSFER..PipelineStage::FRAGMENT_SHADER,
memory::Dependencies::empty(),
&[image_barrier],
);
cmd_buffer.finish()
};
let submission = Submission::new().submit(Some(submit));
device_state.queues.queues[0].submit(submission, Some(&mut transfered_image_fence));
}
複製代碼
let image_view = device.create_image_view(
&image,
image::ViewKind::D2,
ColorFormat::SELF,
Swizzle::NO,
COLOR_RANGE.clone(),
)
.unwrap();
複製代碼
let sampler = device.create_sampler(image::SamplerInfo::new(image::Filter::Linear, image::WrapMode::Clamp));
複製代碼
device.write_descriptor_sets(vec![
pso::DescriptorSetWrite {
set: &desc_set,
binding: 0,
array_offset: 0,
descriptors: Some(pso::Descriptor::Image(&image_srv, image::Layout::Undefined)),
},
pso::DescriptorSetWrite {
set: &desc_set,
binding: 1,
array_offset: 0,
descriptors: Some(pso::Descriptor::Sampler(&sampler)),
},
]);
複製代碼
待續
待續