内容简介:文档列表见:就OpenGL、OpenGL ES、gfx-hal(1:1仿Vulkan接口定义)等KHR定义的图形库接口而言,Texture都有创建、上传数据、下载绘制结果数据、作为Framebuffer的挂载点等操作,下面分别介绍。OpenGL(ES)的Texture对应到Vulkan分别是Image、ImageView、Memory、Sampler,上传/下载Image的数据还需要配合Buffer,涉及到非常多细节。如果是刚开始学习图形开发,不建议使用Vulkan。
文档列表见: Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录)
就OpenGL、OpenGL ES、gfx-hal(1:1仿Vulkan接口定义)等KHR定义的图形库接口而言,Texture都有创建、上传数据、下载绘制结果数据、作为Framebuffer的挂载点等操作,下面分别介绍。
OpenGL(ES)的Texture对应到Vulkan分别是Image、ImageView、Memory、Sampler,上传/下载Image的数据还需要配合Buffer,涉及到非常多细节。如果是刚开始学习图形开发,不建议使用Vulkan。
创建纹理的整体流程:
- 创建Image
- 创建Image关联的Memory
- 关联Image到Memory
上传数据到纹理的整体流程:
- 创建Staging Buffer
- 创建Fence
-
创建用于数据拷贝的Submmit
- 创建Command Buffer
- 创建Barrier
- 向Command Buffer提交Barrier
- 向Command Buffer提交Copy Buffer to Image命令
- 结束Command Buffer编码
- 提交Submmit到GPU命令队列
在Shader使用纹理的整体流程:
- 创建ImageView
- 创建Sampler
- 创建、配置DescriptorSet、DescriptorSetLayout
下载绘制结果数据的整体流程:
待续
作为Framebuffer挂载点的整体流程:
待续
创建纹理的整体流程
创建Image
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(); 复制代码
创建Image关联的Memory
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(); 复制代码
关联Image到Memory
let image = device.bind_image_memory(&memory, 0, unbound).unwrap(); 复制代码
上传数据到纹理的整体流程
创建传输Fence
let mut transfered_image_fence = device.create_fence(false); 复制代码
上传CPU数据到纹理
// 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)); } 复制代码
在Shader使用纹理的整体流程
创建ImageView
let image_view = device.create_image_view( &image, image::ViewKind::D2, ColorFormat::SELF, Swizzle::NO, COLOR_RANGE.clone(), ) .unwrap(); 复制代码
创建Sampler
let sampler = device.create_sampler(image::SamplerInfo::new(image::Filter::Linear, image::WrapMode::Clamp)); 复制代码
配置DescriptorSet
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)), }, ]); 复制代码
以上所述就是小编给大家介绍的《以OpenGL/ES视角介绍gfx-hal(Vulkan) Texture接口使用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 以OpenGL/ES视角介绍gfx-hal(Vulkan) Framebuffer接口使用
- 以OpenGL/ES视角介绍gfx-hal(Vulkan) Shader/Program接口使用
- 企业视角看攻防演练
- 另一个视角看待这次 antd
- 架构视角:文件的通用存储原理
- 许式伟:架构设计的宏观视角
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。