当前位置: 首页 > news >正文

以OpenGL/ES视角介绍gfx-hal(Vulkan) Texture接口使用

文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录)

就OpenGL、OpenGL ES、gfx-hal(1:1仿Vulkan接口定义)等KHR定义的图形库接口而言,Texture都有创建、上传数据、下载绘制结果数据、作为Framebuffer的挂载点等操作,下面分别介绍。

OpenGL(ES)的Texture对应到Vulkan分别是Image、ImageView、Memory、Sampler,上传/下载Image的数据还需要配合Buffer,涉及到非常多细节。如果是刚开始学习图形开发,不建议使用Vulkan。

创建纹理的整体流程:

  1. 创建Image
  2. 创建Image关联的Memory
  3. 关联Image到Memory

上传数据到纹理的整体流程:

  1. 创建Staging Buffer
  2. 创建Fence
  3. 创建用于数据拷贝的Submmit
    • 创建Command Buffer
    • 创建Barrier
    • 向Command Buffer提交Barrier
    • 向Command Buffer提交Copy Buffer to Image命令
    • 结束Command Buffer编码
  4. 提交Submmit到GPU命令队列

在Shader使用纹理的整体流程:

  1. 创建ImageView
  2. 创建Sampler
  3. 创建、配置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)),
    },
]);
复制代码

下载绘制结果数据的整体流程

待续

作为Framebuffer挂载点的整体流程

待续

相关文章:

  • 阿里云应用高可用服务公测发布
  • JAVA入门到精通-第57讲-SQLserver数据类型
  • 利用keepalived实现高可用nginx(修改正)
  • iPhone XS JavaScript性能飙升背后的秘密
  • Java 基础语法
  • 变频电源是什么,变频电源的基础知识的认识
  • springboot配置Druid数据源
  • 红帽高级总监谈OpenJDK的未来:Java的未来从未如此光明
  • 如何设置计算机IP地址
  • expect接收命令行传递的参数并设置为变量和打印变量的值
  • rsync同步数据---把左边的文件全部拷贝到右边
  • 用简单代码看卷积组块发展
  • [译]前端离线指南(上)
  • 在应用开发中,网易云音乐如何兼顾质量和效益
  • 高级软件工程第八次作业:“两只小熊队”团队作业-5
  • 自己简单写的 事件订阅机制
  • angular学习第一篇-----环境搭建
  • Django 博客开发教程 16 - 统计文章阅读量
  • download使用浅析
  • exif信息对照
  • HTML-表单
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Quartz初级教程
  • 跨域
  • 理解在java “”i=i++;”所发生的事情
  • 前端之React实战:创建跨平台的项目架构
  • 深度学习中的信息论知识详解
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 学习HTTP相关知识笔记
  • 移动端解决方案学习记录
  • linux 淘宝开源监控工具tsar
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​queue --- 一个同步的队列类​
  • (175)FPGA门控时钟技术
  • (3)llvm ir转换过程
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (ros//EnvironmentVariables)ros环境变量
  • (二)WCF的Binding模型
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (三)c52学习之旅-点亮LED灯
  • (四) 虚拟摄像头vivi体验
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转) Face-Resources
  • (转)h264中avc和flv数据的解析
  • (转)LINQ之路
  • (转载)从 Java 代码到 Java 堆
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET 发展历程
  • .NET成年了,然后呢?
  • .net实现头像缩放截取功能 -----转载自accp教程网