Vulkan:上传 3 通道图像到设备

2024-04-17

假设主机端有一个3通道图像(float或uint8),需要传输到设备图像。vkCmdCopyBufferToImage用于它。对于设备图像的格式,我看到两个选项:

  1. 使用 R32G32B32A32_SFLOAT/R8G8B8A8_SNORM 并将有效 PCI 带宽减少 25% + 处理主机上的额外通道(额外的 CPU 和/或 RAM)。
  2. 使用未得到广泛支持的 R32G32B32_SFLOAT/R8G8B8_SNORM。

有没有办法在设备上坚持使用 4 通道,但从 3 通道主机缓冲区填充它?


NicolBolas 是正确的,它需要硬件自动将非 4 通道图像传输到 4 通道图像内存,或者支持 3 通道图像纹理。但是,为什么不充分利用吞吐量增强功能并使用计算着色器将纹理作为着色器缓冲区,并以正确的格式读出数据,而不是像从主机逐像素复制图像那样缓慢地进行操作?

这就是我的意思:

  • 你已经有了一个 3 通道图像,但此时它只是数据。

  • 您暂时将其作为缓冲区上传到设备。

  • 在计算着色器中,从图像中读取通道,并将结果直接写入图像在设备上.

使用图像的示例

正如所指出的,您还可以直接写入图像缓冲区,这意味着您不必调用单独的缓冲区副本来复制图像。

#version 450

// should be tightly packed if I read the spec correctly
// https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf
layout(std430, binding = 0) buffer in_3_channel 
{
    vec3 input_channel[ ];
};

layout (binding = 1, rgba32f) uniform image2D result_image;

layout (local_size_x = 256) in;

layout (binding = 2) uniform UBO 
{
    int image_size;
    int image_cols;
} ubo;


void main() 
{
    uint index = gl_GlobalInvocationID.x;
    if (index >= ubo.image_size){
        return; 
    }

    vec3 in_color = input_channel[index];
    vec4 out_color = vec4(in_color, 1.0);
    // using an image instead, we would write using this:
    int row = gl_GlobalInvocationID.x / image_cols;
    int col = gl_GlobalInvocationID.x % image_cols;
    ivec2 image_write_location = ivec2(row, col);
    imageStore(result_image, image_write_location, out_color);
}

使用缓冲区的示例:

#version 450

// should be tightly packed if I read the spec correctly
// https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf
layout(std430, binding = 0) buffer in_3_channel 
{
    vec3 input_channel[ ];
};

layout(std430, binding = 1) buffer out_4_channel{
    vec4 output_channel[ ];
};
//alternatively you could use a image buffer directly ex:
//
//layout (binding = 1, rgba32f) uniform image2D result_image;

layout (local_size_x = 256) in;

layout (binding = 2) uniform UBO 
{
    int image_size;
} ubo;


void main() 
{
    uint index = gl_GlobalInvocationID.x;
    if (index >= ubo.image_size){
        return; 
    }

    vec3 in_color = input_channel[index];
    vec4 out_color = vec4(in_color, 1.0);
    output_channel[index] = out_color;
    // using an image instead, we would write using this:
    // ivec2 image_write_location = ivec2(gl_GlobalInvocationID.x / image_cols, gl_GlobalInvocationID.x % image_cols);
    //imageStore(result_image, image_write_location, out_color);
}

如果您想将缓冲区复制到纹理,则可以将数据复制到图像,如下例所示:https://vulkan-tutorial.com/Texture_mapping/Images https://vulkan-tutorial.com/Texture_mapping/Images

    //staging buffer is your new converted RGB -> RGBA buffer. 
    transitionImageLayout(textureImage, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
        copyBufferToImage(stagingBuffer, textureImage, static_cast<uint32_t>(texWidth), static_cast<uint32_t>(texHeight));
    transitionImageLayout(textureImage, VK_FORMAT_R32G32B32A32_SFLOAT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);

结论

现在,您已经获得了主机->设备带宽优势,利用了 GPU 的计算能力,并且仅在 3 通道内存的初始传输中接触了主机。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vulkan:上传 3 通道图像到设备 的相关文章

  • 支持Vulkan的移动GPU

    去年差不多这个时候 Vulkan标准发布 NVIDIA和AMD随之发布了显卡的Vulkan驱动 虽然都是实验版本 但是毕竟能够工作的 Intel的速度就慢了不少 时隔一年 Intel终于推出了Vulkan认证的驱动 虽然之前就有了实验性质的
  • Vulkan入门精要

    Vulkan入门精要 fuxiii github io https fuxiii github io Essentials of Vulkan
  • Vulkan学习(一):Vulkan环境搭建(Windows)&官方教程--(Base code & Instance & Validation layers)

    目录 前言 Vulkan相关资源地址 Vulkan安装 Vulkan教程环境相关 Vulkan 示例相关 Vulkan教程学习笔记 Vulkan程序的基本结构 initWindow GLFW initVulkan mainLoop clea
  • 从Gles、Vulkan到Metal(一)-- 数据和提交

    无论以任何形式本篇文章内容 请注明来自leonnwei的csdn blog 引言 一直想整理下关于移动端图形编程API的文档 图形API为何重要 如果说图形编程的内功是计算机图形学的诸原理和算法 那么外功就是实实在在的硬件API 不能精通A
  • Vulkan开发环境配置 Win10+VS2019

    官方的环境配置教程 https vulkan tutorial com Development environment 一 下载SKD 进入官网 https vulkan lunarg com 由于是windows下进行开发 所以选择win
  • Vulkan教程 - 17 描述符与内存对齐

    之前章节的描述符布局描述了描述符可以绑定的类型 本章我们要对每个VkBuffer资源创建一个描述符集合来将它绑定到统一缓冲描述符上 描述符集合不能够直接创建 必须从一个池中分配 就和命令缓冲一样 同样的 对应也有描述符池 写一个新方法cre
  • Vulkan同步机制和图形-计算-图形转换的风险(一)

    在现代渲染环境中 很多情况下在一个数据帧期间会产生计算负荷 在GPU上计算通常 非固定功能 是并行编程的 通常用于具有挑战性 完全不可能或仅通过标准图形管道 顶点 几何 细化 栅格 碎片 实现的效率低下的技术 一般情况下 计算在实现技术方面
  • 【PBR系列二】辐射度量学理论

    本文核心知识主要参照 现代计算机图形学入门 闫令琪课程课件PPT 后续光线追踪系列辐射度量学知识也源于此处 辐射度量学理论 在开始之前我们先思考 为什么学习辐射度量学 辐射度量学是基于物理光照的基础 一 辐射能和辐射通量 辐射能 Radia
  • Vulkan-程序结构

    程序结构 一般来说 完整的Vulkan程序包含 创建Vulkan实例 获取物理设备列表创建逻辑设备 创建命令缓冲 获取设备中支持图形工作的队列 初始化交换链 创建深度缓冲 创建渲染通道 创建帧缓冲 创建绘制对象 初始化渲染管线 创建栅栏和初
  • Vulkan 绘制显示设计

    背景 众所周知 Vulkan是个跨平台的图形渲染API 为了友好地支持跨平台 Vulkan自然也抽象出了很多接口层去对接各个操作系统 抹平系统间的差异 Swap Chains即为WSI 其本质上是一种图像队列 此队列会按顺序依次将队列中的若
  • 着色器中包围体层次结构的遍历

    我正在使用 vulkan 计算着色器开发路径跟踪器 我实现了一棵树代表包围体层次结构 BVH 的想法是最大限度地减少需要执行光线相交测试的对象数量 1 简单的实施 我的第一个实现非常快 它遍历树到singleBVH 树的叶子 然而 射线可能
  • Wat 执行“vkCreateSwapchainKHR:内部可绘制对象创建失败”。方法

    我总是卡在交换链的创建上 我不知道为什么 我启用了验证层 我得到的最好的答案是 vkCreateSwapchainKHR 内部绘图创建失败 我有一张 Nvidia GTX960 卡 我在它上面运行了一些 vulkan 样本 所以它必须支持
  • 使用 CMake 和 conan 包管理器正确设置 Vulkan、glfw 和 spdlog

    我正在开发 Vulkan API 的渲染器 我在使用 CMake 和 conan 包管理器正确设置项目时遇到了很大的麻烦 让我们看一下我的 conanfile py 的依赖设置 from conans import ConanFile CM
  • Vulkan 的 VkMemoryHeapFlagBits 是否缺少值?

    在 Vulkan 规范 1 0 9 第 180 页 中 我们有以下内容 typedef struct VkMemoryHeap VkDeviceSize size VkMemoryHeapFlags flags VkMemoryHeap 和
  • vkCreateDebugReportCallback EXT 未链接,但 vulkan.h 中的所有其他函数都可以完美运行

    所以我最近一直在尝试学习 Vulkan 在尝试让验证层工作时 我收到错误 LNK2019 1 gt Renderer obj error LNK2019 unresolved external symbol vkCreateDebugRep
  • GPU 上的相干内存是什么?

    我在记忆中不止一次遇到 非连贯 和 连贯 记忆这个术语 科技论文 https renderdoc org vulkan in 30 minutes html与图形编程相关 我一直在寻找简单明了的解释 但发现大部分是 硬核 论文this ht
  • 如何为已渲染的多个3D模型拥有多个模型矩阵?

    我已经遵循了 vulkan 教程的大部分内容 https vulkan tutorial com https vulkan tutorial com 我目前有一个 vulkan 程序 可以使用 OBJ 文件加载多个 3D 模型 但是我只有一
  • Vulkan:上传 3 通道图像到设备

    假设主机端有一个3通道图像 float或uint8 需要传输到设备图像 vkCmdCopyBufferToImage用于它 对于设备图像的格式 我看到两个选项 使用 R32G32B32A32 SFLOAT R8G8B8A8 SNORM 并将
  • 什么时候关闭光栅化步骤才有意义?

    在 vulkan 中 有一个创建管道所需的结构 名为VkPipelineRasterizationStateCreateInfo 在这个结构体中有一个名为rasterizerDiscardEnable 如果该成员设置为VK TRUE那么在光
  • vulkan 扩展:哪些由谁支持?

    有EXT KHR or AMD or NV扩展 也许还有其他一些 我知道NV means NvidiaAMD 不太可能支持 it nv 扩展 但是 khr 或 ext 又如何呢 他们是所有人都强制支持的吗 有一个website https

随机推荐

  • Corba 事件客户端 ETIMEDOUT

    我使用omniOrb 和Python 构建了一个CORBA 事件服务客户端 我在使用 Java 客户端时遇到了同样的问题 我非常确定我遇到了与这篇文章相同的事情 因为我的 strace 看起来非常相似 但他没有确切解释他是如何修复它的 Ja
  • 对于 Buffer 等运算符来说,打开和关闭边界的含义是什么?

    我不明白需要打开或关闭边界的 Buffer 运算符的重载 我指的重载是 public static IObservable
  • 如何使用 python 和 Opencv 计算图像中的点数?

    I want to count number of dots in an image The image looks like 我参考了这个 SOF 链接计算图像中的彩色点 https stackoverflow com questions
  • 即使使用stream_set_blocking,PHP SSH2流内容仍为空?

    我正在开发一个工具 它使用 PECL SSH2 扩展通过 SSH2 从远程主机读取 iptables 配置 我能够成功连接到主机 进行身份验证并执行命令 我遇到的问题是有时该流不包含任何数据 Load the current firewal
  • TwoSum 算法:如何改进?

    我想做一个算法并发现这个问题leetcode http www leetcode com 给定一个整数数组 找到两个数字 使它们加起来等于特定的目标数字 函数twoSum 应返回两个数字的索引 以便它们相加达到目标 其中index1 必须小
  • Jython,仅使用 Java 中的 Python 方法?

    阅读和使用时本文 http www rexx com dkuhlman jython course 03 html example the jython classes它假设我们有一个完整的对象定义 包含类和从 python 到 java
  • 查找日期的两个周期之间重叠的天数

    我有两个表 每个表都保存日期期间 从 date1 到 date2 我将在表1和表2中查找两个日期期间之间的重叠天数 Example table1 id FromDate ToDate 1 2000 01 01 2000 02 04 2 20
  • 映射减少计数示例

    我的问题是关于mapreduce programming in java 假设我有 WordCount java 示例 一个标准mapreduce program 我希望map函数收集一些信息 并返回形成如下的reduce函数map
  • 如何从单独的文件下载用于 cmake 中交叉编译的工具链?

    我有一个项目 根目录中有一个 CMakeLists txt 文件 该项目在 Linux 和 OSX 上编译得很好 现在我想为 MIPS OpenWRT 交叉编译它 我想尽可能地自动化它 所以我将使用以下代码来下载工具链并设置编译器变量 Ex
  • 停止并重新启动计时器

    我想停止这个计时器 然后从停止的地方重新启动它 secondsTimer Timer scheduledTimer timeInterval 1 0 target self selector selector addSeconds user
  • 覆盖 FILE_LOG_PATTERN (如果可能的话每个环境)

    我想覆盖 Spring Boot 的默认文件和控制台日志模式以包含一些自定义 MDC 字段 有没有一种简单的方法可以使用application properties yaml 如果没有的话 这将是一个很好的功能 否则我可能不得不复制 Boo
  • 比较当前文件版本和上一个远程存储库

    如何区分我的工作文件版本与远程存储库中的某些先前版本 假设我今天拉取 对本地副本执行 6 8 次提交 然后想要查看我的最新工作版本 给定文件 与远程或任何其他版本上的最新版本之间的差异 要查看 最新工作版本 我将其作为您的工作副本 之间的差
  • 使用 sharekit 在 Facebook 上添加图像和描述

    我正在使用 sharekit 在 Facebook 上分享文本 我想在文本附近添加一张图片 如下图所示 知道如何做到这一点吗 还有其他合适的库 例如 sharekit 吗 谢谢 将 og image 元标记添加到 head html 块中
  • 如何获取使用 AngularDart 的路线?

    这是我的代码 import package angular angular dart class AppModule extends Module AppModule type AppController type LoginControl
  • Biopython无法直接访问异质残基

    我可以使用以下方法直接获取蛋白质 1n31 的残基 residue structure 0 A 100 然而 当我尝试访问异质残基时 例如 residue structure 0 A 2003 我收到错误消息 File
  • 顺序订阅可观察数组

    在这里 我用过forkJoin从 rxjs 并行订阅可观察数组 但我想一一订阅 最好的解决方案是什么 下面是我的代码 var observables Observable forkJoin observables subscribe gt
  • 从 Vaadin 8 Grid 获取列表

    Problem 我有一个 Vaadin 8 Grid 但我找不到提取其中项目的方法 描述 从网格开始 Grid
  • Clojure:避免埃拉托斯特尼筛中的堆栈溢出?

    这是我在 Clojure 中实现的埃拉托斯特尼筛法 基于 SICP 流课程 defn nats from n iterate inc n defn divide p q zero rem q p defn sieve stream lazy
  • 未找到 SDL2_image

    我正在尝试编译以下具有标题的代码 include
  • Vulkan:上传 3 通道图像到设备

    假设主机端有一个3通道图像 float或uint8 需要传输到设备图像 vkCmdCopyBufferToImage用于它 对于设备图像的格式 我看到两个选项 使用 R32G32B32A32 SFLOAT R8G8B8A8 SNORM 并将