Hello Vulkan(五)

2023-11-07

上一期技术分享中,我们讲述了如何关于Vulkan的Data Buffers使用及VMA内存管理器使用,自己创建或使用VMA在显存里创建Buffers,并在CPU进行读取或写入。

本期将继续分享关于Vulkan的技术,内容是非常有趣的部分,即「纹理绘制」,我们会介绍如何在Vulkan中如何进行纹理映射,所见即所得。很有趣的是,我们虹图的英文即“TexelJoy”,其中“Texel”就是纹理的最小单元 – 纹素,熟悉图形渲染的同学肯定不陌生,如果你感觉陌生也没关系,像素“Pixel”总听过吧,接下来本期讲述的内容也会涉及纹素和像素的关系。

基础概念

纹理映射:图形渲染中的一种将单独的图片映射覆盖到3D模型上,并且跟随模型移动、变换,映射到屏幕空间的图形渲染操作。

纹理:进行纹理映射的图片,部分硬件要求必须是2的整数幂,当然也并不是所有硬件的要求,确保安全最好是2的整数幂。

像素(Pixel):屏幕上的每个小点。

纹素(Texel):纹理上的每个小点。使用纹素这个术语,而不是像素来表示纹理对象中的显示元素,主要是为了强调纹理对象的应用方式。

纹理坐标:我们使用S,T来表示纹理对象中的纹素位置。S,T也可以用U,V来表示,纹理坐标有时也称UV坐标。

映射原理:带有纹理坐标的3D模型会在每个顶点都有ST纹理坐标,由纹理坐标找到对应应该在屏幕显示的纹理中纹素位置,如下图:

那么如何给每个顶点指定合适ST坐标呢?

平面比较容易,做个比例缩小即可:

球体那就要做一些运算:

换做经纬度:

这样的模型呢?貌似有些复杂了。

这个可以放心,都是现成的自动化算法可以直接使用进行计算ST坐标。

存储类型

让我们回到Vulkan,先说内存类型,首先分为CPU内存和GPU显存,GPU显存则分为主机内存(Host Visible Memory)和设备内存(Device Local Memory)。CPU可以向主机内存进行读写操作。设备内存是一种设备可见的内存,常见的缓冲内存和图像内存,可以被设备本地快速使用,而设备内存最大的用处就是储存纹理,因为纹理读取是需要快速完成的。

在Vulkan里应该如何设置纹理映射的参数呢?我们先看下之前OpenGL如何进行参数设置的:

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT ); 
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT ); 
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); 
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); 

但在Vulkan里则是有一定区别的,但是类似于创建Buffer的操作。

MyTexture MyPuppyTexture; 
... 
VkSamplerCreateInfo vsci; 
vsci.magFilter = VK_FILTER_LINEAR; 
vsci.minFilter = VK_FILTER_LINEAR; 
vsci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR; 
vsci.addressModeU = VK_SAMPLER_ADDRESS_MODE_REPEAT; 
vsci.addressModeV = VK_SAMPLER_ADDRESS_MODE_REPEAT; 
vsci.addressModeW = VK_SAMPLER_ADDRESS_MODE_REPEAT; 
...
result = vkCreateSampler( LogicalDevice, IN &vsci, PALLOCATOR, OUT &MyPuppyTexture->texSampler); 

对比下Vulkan和OpenGL,其实可以发现在设置Mode为LINEAR(线性滤波法)时Vulkan是mipmapMode,而OpenGL只是Mode。那么这个Mipmap是什么意思呢?Mipmap是缩小版本的image,每个新image是前一张图的宽度和高度的一半。Mipmap用于作为细节级别(即Level of Detail)的一种方式。远离相机的物体将从较小的mip图像中采样纹理。使用较小的图像可以提高渲染速度,避免锯齿,具体做法就是平均4个像素,生成1个新的像素,依次循环。

最后放一个我觉得对大家有帮助的文件,就是如何把一个bmp、png、jpg图片读取成纹理。

typedef struct MyTexture
 { 
uint32_t          width;
uint32_t          height;
VkImage         texImage;
VkImageView     texImageView;
VkSampler        texSampler;
VkDeviceMemory   vdm;
} MyTexture;
…
MyTexture MyPuppyTexture; 
result = Init06TextureBufferAndFillFromBmpFile ( “puppy1.bmp”, &MyPuppyTexture); Init06TextureSampler( &MyPuppyTexture.texSampler ); 

关于Vulkan关于Command Buffers的内容,我们会在本系列后续内容中继续与大家分享,Command Buffers也是Vulkan中很难理解,但却很重要的一部分内容。

敬请期待~

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

Hello Vulkan(五) 的相关文章

随机推荐

  • STM32单片机Flash模拟EEPROM

    摘要 STM32单片机都带有ROM和RAM 其中STM32根据自身的ROM Flash 可以分为小容量产品 中容量产品 大容量产品 根据FLASH容量可以分为 小容量 0 32K 中容量 64 128K 大容量 256K以上 包含256K
  • 【Green公式】Hunter’s Apprentice(判断多边形为顺时针或逆时针)--鞋带公式

    题目描述 When you were five years old you watched in horror as a spiked devil murdered your parents You would have died too
  • C语言字节对齐

    文章来源于 点击打开链接 文章最后本人做了一幅图 一看就明白了 这个问题网上讲的不少 但是都没有把问题说透 一 概念 对齐跟数据在内存中的位置有关 如果一个变量的内存地址正好位于它长度的整数倍 他就被称做自然对齐 比如在32位cpu下 假设
  • ElasticSearch基础操作入门

    参考 4条消息 教你快速入门ElasticSearch 超详细简单 暗余的博客 CSDN博客 elasticsearch菜鸟教程 一个索引就是一个拥有几分相似特征的文档的集合 使用Chrome浏览器ElasticSearch Head 具体
  • 巨潮资讯网年报爬虫

    巨潮资讯网年报爬虫 代码直接复制即可使用 这是一个Post请求爬虫 与Get请求存在一点小区别 不过核心思想是一致的 Tips 需要在py文件夹目录下 新建一个 年报 名称的文件夹 存放下载的报表 同时在py文件夹目录下 需要一个stock
  • 游戏开发Unity杂项知识系列: CSharpCodeProvider could not be found in the namespace Micrrosoft.CSharp

    unity 进行build and run 时报错 The type name CSharpCodeProvider could not be found in the namespace Microsoft CSharp This typ
  • numpy学习笔记

    Numpy基础数据结构 NumPy数组是一个多维数组对象 称为ndarray 其由两部分组成 实际的数据 描述这些数据的元数据 import numpy as np import time ar np array 1 2 3 4 5 6 7
  • 什么是拷贝构造函数?拷贝构造函数何时被调用

    1 什么是拷贝构造函数 CA const CA C 就是我们自定义的拷贝构造函数 可见 拷贝构造函数是一种特殊的构造函数 函数的名称必须和类名称一致 它的唯一的一个参数是本类型的一个引用变量 该参数是const类型 不可变的 例如 类X的拷
  • python widget_python 图形界面

    Python自带的库是支持Tk的Tkinter 使用Tkinter 无需安装任何包 就可以直接使用 Tk是一个图形库 支持多个操作系统 导入Tkinter包的所有内容 from tkinter import 从Frame派生一个Applic
  • R与R Studio及R tools不冲突版本

    R与R Studio及R tools不冲突版本 R 3 6 3 R Studio 1 1 463 R tools 35 R 4 0 2 R Studio 1 3 1073 R tools 4 0 其他造成R Studio打开空白问题 1 路
  • Python+Requests+Unittest+Excel 接口自动化测试框架之Request模块01

    1 Requests模块 a Request模块是Python中可以实现模拟Http协议的模块 b 安装方式很多 可以用pip install requests 2 举例 import requests class Http Request
  • php://filter伪协议(总结)

    前言 这篇文章主要是关于php filter伪协议中的知识点总结 分析了常见的用法 文章目录 前言 php filter伪协议总结 php filter伪协议介绍 php filter伪协议使用方法 php filter过滤器分类 filt
  • CSDN-markdown编辑器

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题 有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一个表格 设定内容居中 居左 居右 Sma
  • 大数据分析机器学习的数据清理和准备

    数据清理和准备是任何机器学习项目中至关重要的第一步 尽管我们经常认为数据科学家花费大量时间来修改算法和机器学习模型 但现实情况是大多数数据科学家花费大量时间来清理数据 在大数据分析机器学习的数据清理和准备中 我们将逐步介绍使用Python进
  • 管理神话之23:随便多少人你都能管

    原文作者 Johanna Rothman Cindy 我要给你的团队再加三个人 Patrick 公司的CTO 斜靠在门口 话音刚落 他转身就想离开 等等 这事我们要讨论一下 你不能这样扔下炸弹后就一走了之 你为什么要我再招更多的人 Cind
  • java并发篇面试

    文章目录 java并发篇 java如何开启线程 怎么保证线程安全 Volatile和Synchronized有什么区别 Volatile能不能保证线程安全 DCL Double check Lock 单例为什么要加Volatile JAVA
  • pycharm激活, pycharm远程调试

    pycharm professional 2017 2 3下载 百度盘公开地址 https pan baidu com s 1geDnVVX 1 pycharm激活 license server 1 激活窗口选择 Activate new
  • C++ Thread

    Thread 线程库 线程的创建 detach 句柄独立 线程资源转移 sleep for 全局函数线程化 joinable hardware concurrency 线程的互斥 原子操作定义 互斥锁 try lock recursive
  • Spring bean的生命周期

    对于普通的Java对象 当new的时候创建对象 当它没有任何引用的时候被垃圾回收机制回收 而由Spring IoC容器托管的对象 它们的生命周期完全由容器控制 bean的声明 bean的声明有好几种 如上图 上图声明的一些bean信息可以通
  • Hello Vulkan(五)

    上一期技术分享中 我们讲述了如何关于Vulkan的Data Buffers使用及VMA内存管理器使用 自己创建或使用VMA在显存里创建Buffers 并在CPU进行读取或写入 本期将继续分享关于Vulkan的技术 内容是非常有趣的部分 即