
Vulkan
文章平均质量分 95
捉不住的鼬鼠
自由光耀世界!
展开
-
Google Filament引擎编译记录
我之前写过两篇Filament编译文档,就在我的网站上,可以到如下地址找到:https://byteori.com/doc.html现在又在做安卓有关开发和编译的问题,尤其是涉及到C++原生代码编译so文件,然后安卓端引入打包成apk,这一套流程Filament都有。另外,它还有Vulkan后端,并配合OpenGL后端可以切换,它还是个PBR渲染引擎,和我目前在做的工作可谓非常吻合。因此,我又要学习Filament了,尤其是编译这一块,是我目前主要需要打通的工作点。更多的不写了,前面两篇文档记录原创 2020-03-28 10:49:38 · 2714 阅读 · 4 评论 -
Vulkan教程 - 11 帧缓冲和命令缓冲
帧缓冲我们前面的章节已经讨论很多了,而且我们已经建立了渲染通道,以便得到单个的帧缓冲,有着和交换链图像一样的格式,但是我们还没有真正创建什么东西呢。在渲染通道创建过程中指定的附件通过把它们包装成一个VkFramebuffer对象来绑定到一起。帧缓冲对象引用了所有表示附件的VkImageView对象。我们这里就一个附件,即颜色附件。但是,我们为了这个附件要用的图像依赖于当我们获取图像用于呈现的时...原创 2019-06-18 17:30:11 · 883 阅读 · 0 评论 -
Vulkan教程 - 17 描述符与内存对齐
之前章节的描述符布局描述了描述符可以绑定的类型。本章我们要对每个VkBuffer资源创建一个描述符集合来将它绑定到统一缓冲描述符上。描述符集合不能够直接创建,必须从一个池中分配,就和命令缓冲一样。同样的,对应也有描述符池。写一个新方法createDescriptorPool来建立它,把它放在初始化Vulkan的创建统一缓冲之后:createUniformBuffers();create...原创 2019-06-26 20:34:17 · 2306 阅读 · 4 评论 -
Vulkan教程 - 25 多重采样(教程结束)
现在我们的程序可以加载贴图LOD了,可以在渲染远处对象的时候修复假象。现在图像看起来更平滑了,但是离近看的时候会发现几何边缘线有凹凸不平锯齿状的图案。这个并非我们想要的效果就是锯齿,是用于渲染的像素个数受限导致的。由于没有显示器是无限多像素的,所以总会在某些程度上看到该现象。有一些方法可以处理该问题,本章我们着重看一个比较流行的做法,就是多重采样(MSAA)。一般的渲染中,像素颜色是由单个...原创 2019-07-08 15:07:35 · 1420 阅读 · 0 评论 -
Vulkan教程 - 15 索引缓冲
顶点缓冲已经能正常工作了,但是让我们能够从CPU访问的内存类型可能对显卡本身读取来说不是最优的。最好的内存会有VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT标记,且通常在专用显卡上不可以用CPU访问。本章我们创建两个顶点缓冲,一个位于CPU可访问内存中的临时缓冲来上传来自顶点数组的数据,一个设备本地内存中的最终的顶点缓冲。我们使用缓冲复制命令来移动数据,从临时缓冲移动到实际...原创 2019-06-24 20:40:08 · 605 阅读 · 0 评论 -
Vulkan教程 - 20 图像采样器
本章我们继续创建两个资源,用于图形管线采样图像。第一个资源是我们已经见过的,也就是和交换链图像打交道的时候用的,但是第二个则是新的,它和着色器如何从图像读取纹素有关。我们之前就见到过,有了交换链图像和帧缓冲,图像可以通过图像视图访问而不是直接访问。也要为贴图图像创建这样一个图像视图。添加一个类成员textureImageView存储贴图图像的VkImageView,然后创建一个新的方法cr...原创 2019-07-03 11:38:20 · 1638 阅读 · 0 评论 -
Vulkan教程 - 21 组合图像采样器
在统一缓冲章节我们第一次见到了描述符,这一章我们会介绍一个新的描述符,即组合图像采样器。该描述符让着色器通过一个采样器对象访问图像资源成为了可能。修改描述符布局、描述符池和描述符集合以包括组合图像采样器描述符。之后,我们添加贴图坐标到Vertex,修改片段着色器来从贴图读取颜色而不是仅仅对顶点颜色进行插值。浏览到createDescriptorSetLayout方法,添加一个VkDescr...原创 2019-07-03 16:11:17 · 907 阅读 · 0 评论 -
Vulkan教程 - 22 深度缓冲
现在创建的几何对象是投影到3D中的,但是还是完全的平面。本章我们添加一个Z坐标来为3D网格做准备。我们会使用这个第三个坐标来放置一个正方形在我们当前正方形之上,从而引出不进行深度排序存在的问题。修改Vertex结构体来为位置使用3D向量,并更新format:glm::vec3 pos;...attributeDescriptions[0].format = VK_FORMAT_R32...原创 2019-07-03 20:32:15 · 1317 阅读 · 0 评论 -
Vulkan教程 - 23 加载模型
现在你的程序已经为有贴图的3D网格渲染做好准备了,但是现在的顶点和索引数组都是比较无聊的。本章我们扩展该程序来从真实的模型文件加载顶点和索引数据,以让显卡做点真正的工作。许多图形API教程让读者自己写OBJ加载器,这样做的问题是,稍微有点意思的3D程序很快会要求本格式不支持的特性,比如骨骼动画。我们会从OBJ模型加载数据,但是我们主要关注集成网格数据,而不是如何从文件加载。我们会使用tin...原创 2019-07-04 20:33:07 · 1820 阅读 · 3 评论 -
Vulkan教程 - 24 生成Mip贴图
现在我们的程序可以加载和渲染3D模型了,本章我们再添加一个新的特性,Mip贴图。Mip贴图是被游戏和渲染软件所广泛使用的,Vulkan也对Mip生成给了我们足够的控制。Mip贴图是图像预先计算好的缩小版本。每个新的图像宽高都是之前图像宽高的一半。Mip贴图可以作为LOD的一种格式。远离计算机的对象会从较小的mip图像中采样。使用较小图像能提高渲染速度并避免一些假象,如龟纹。mip级别个数是...原创 2019-07-05 15:30:58 · 1138 阅读 · 0 评论 -
Vulkan教程 - 18 阶段性总结
Vulkan学习几周了,稍微整理下。由于一开始的博客就是从环境搭建开始的,所以并没有对Vulkan的特性和教程的目标及步骤进行记录。这里主要就是做这个工作,所以这个总结并不是对Vulkan高屋建瓴的总结心得,暂时还没这么厉害。Vulkan简介简介一句话来说,Vulkan是一个跨平台2D和3D图形接口,由Khronos Group(中文名为柯罗诺斯,是古希腊神话中的原始神)集团在2015...原创 2019-07-01 10:24:11 · 2702 阅读 · 0 评论 -
Vulkan更新扩展;Vulkan添加扩展
最近学到了如何更新和添加Vulkan的扩展,就是通过更新驱动的方式。自己写代码制作扩展我不太确定是否可以。问题是这样的:const std::vector<const char*> deviceExtensions = { VK_KHR_SWAPCHAIN_EXTENSION_NAME, VK_EXT_DEPTH_CLIP_ENABLE_EXTENSION_N...原创 2019-07-19 10:48:29 · 5029 阅读 · 0 评论 -
Vulkan教程 - 19 贴图和管线屏障
现在逐个顶点加上颜色,几何体已经是彩色的了,但是这其实是不太好的办法。本章我们要实现贴图映射,这会让几何体看起来更有趣,也能够让我们加载和绘制3D模型。向程序中添加贴图涉及如下步骤:创建一个由设备内存支持的图像对象;从一个图像文件中取得像素来填充该对象;创建一个图像采样器;添加一个联合图像采样器来从材质中采样颜色。我们以前就和图像目标打过交道,但是这些都是交换链扩展自动创建...原创 2019-07-02 20:37:00 · 1250 阅读 · 0 评论 -
Vulkan教程 - 10 创建图形管线
在我们完成管线创建之前,我们需要告诉Vulkan渲染将要用到的帧缓冲附件的信息。我们需要明确有多少颜色和深度缓冲,每个又有多少采样以及它们的内容应该如何通过渲染操作来进行处理。所有这些信息都包装在渲染通道(render pass)对象中,我们就创建一个新的方法createRenderPass,在initVulkan中调用它,且它在createGraphicsPipeline之前。我们这里仅有一...原创 2019-06-18 16:18:00 · 1533 阅读 · 0 评论 -
Vulkan教程 - 16 MVP与统一缓冲对象
我们现在能为每个顶点传输任意属性到顶点着色器了,但是用全局变量怎么样呢?我们本章要转移到3D图形上,这要求Model-View-Projection矩阵,也就是MVP矩阵(模型-视口-投影矩阵)。 我们可以将它包括进来作为顶点数据,但是这比较浪费内存,也要求我们在它的变换改变的时候更新顶点缓冲,而变换是很可能在每一帧都改变的。Vulkan中正确处理该问题的方法是使用资源描述符。描述符是着色器能...原创 2019-06-26 11:37:56 · 1192 阅读 · 0 评论 -
Vulkan教程 - 01 环境搭建
根据工作需要,开始学习Vulkan了。由于以前没有太接触图形的知识,感觉Vulkan学习任重道远啊。毕竟是很底层,很核心的技术,而且要用C或者C++,难是肯定的。就像之前学习shader,感到涉及了很多东西。那些光照和贴图等各种不同设置,分别能实现什么样的效果,看着就很高深了。没办法,雄关漫道真如铁,而今迈步从头越。先从这个教程看:https://vulkan-tutorial.com/...原创 2019-05-28 17:14:45 · 16203 阅读 · 0 评论 -
Vulkan教程 - 02 代码架构及实例创建
本篇博客继续学习Vulkan,主要是基础代码学习记录。先来一个通用的结构:#include <vulkan/vulkan.h>#include <iostream>#include <stdexcept>#include <functional>#include <cstdlib>class HelloTriang...原创 2019-05-29 10:21:32 · 1872 阅读 · 0 评论 -
Vulkan教程 - 07 图像视图和图形管线
图像视图使用任何的VkImage,包括在交换链中的,我们都要在渲染管线中创建VkImageView对象。图像视图描述了如何获取图像,获取图像的哪个部分,比如它是否应该被当作2D材质深度材质对待而没有任何mipmapping等级。本章我们写一个createImageViews方法,为交换链中每个图像创建一个基础图像视图,以便我们后续用来作为颜色目标。首先添加一个类成员存储图像视图:st...原创 2019-06-06 16:27:41 · 841 阅读 · 0 评论 -
Vulkan教程 - 03 验证层
Vulkan API设计一开始就是要减轻驱动负担,所以API本身的错误检查很少。但是并不表示我们不能向API添加这些检查,这也就是validation layers的功能了。验证层中常用的操作有:检查参数值以避免误用;追踪创建和销毁对象以查找资源泄露;检查线程安全;记录每次调用的参数;跟踪Vulkan调用以进行分析和重现。验证层必须要安装到系统中之后才能使用,比如Lunar...原创 2019-05-29 17:30:27 · 2271 阅读 · 0 评论 -
Vulkan教程 - 12 栅栏和信号量
这一章所有东西都会整合到一起了。我们将会写一个drawFrame方法,它会被主循环调用,将三角形呈现到屏幕上。创建drawFrame方法在mainLoop的while内处理事件后调用:void mainLoop() { while (!glfwWindowShouldClose(window)) { glfwPollEvents(); drawFram...原创 2019-06-19 19:47:27 · 1917 阅读 · 0 评论 -
Vulkan教程 - 05 逻辑设备与窗口表面
逻辑设备选择了物理设备后,我们需要建立逻辑设备来交互了。逻辑设备创建过程和实例创建过程类似,且描述了我们想要的特性。向类中添加一个新的成员变量存储逻辑设备句柄:VkDevice device;接着,添加函数createLogicalDevice以便在initVulkan中调用。创建逻辑设备涉及到在结构体中明确许多信息的操作,首先是设置VkDeviceQueueCreateInfo。该...原创 2019-06-03 20:09:20 · 1525 阅读 · 6 评论 -
Vulkan教程 - 08 着色器及编译SPIR-V
着色器模块不像是之前的API,Vulkan着色器代码一定要用字节码格式,而不是人类可读的语法如GLSL和HLSL。这个字节码就是SPIR-V,设计用于Vulkan和OpenCL。这是一个可以用于编写图形和计算着色器的格式,但是我们主要关注的是Vulkan的图形管线。使用字节码格式的优点之一是GPU厂商写的编译器将着色器代码转化为原生代码会非常简单。过去的经验表明,人类易读的语法如GLSL,某些...原创 2019-06-10 17:25:24 · 5025 阅读 · 0 评论 -
Vulkan教程 - 13 重建交换链
现在我们的程序能成功绘制三角形了,但是还有一些情况,它还不能很好地处理。窗口表面可能会改变,导致交换链与其不兼容。这种事情发生的可能原因之一是窗口的大小改变了。我们要能抓取这些事件,然后重建交换链。创建一个recreateSwapChain方法,它会调用createSwapChain以及为依赖交换链或者窗口大小的对象调用所有创建方法。void recreateSwapChain() {...原创 2019-06-20 20:31:51 · 1449 阅读 · 0 评论 -
Vulkan教程 - 06 交换链
Swap chain(交换链)现在到了Vulkan教程第十章了,学习交换链。Vulkan没有默认帧缓冲的概念,因此它需要一个基础设施,能够在我们通过屏幕看到内容之前,持有我们想要渲染的东西的缓冲。该基础设施就是交换链了,必须显式创建。交换链本质上是一个图像队列,等待显示到屏幕上。我们的应用将会获取这样的一个图片来向其进行绘制,然后将它返回给队列。队列究竟怎么工作的,以及从队列中呈现一个图像的条...原创 2019-06-05 17:17:02 · 2222 阅读 · 0 评论 -
Vulkan教程 - 14 顶点缓冲
接下来几章,我们会使用内存中的顶点缓冲替换掉顶点着色器中的硬编码顶点数据。我们用最简单的方式开始,创建一个CPU可见的缓冲,使用memcpy来将顶点数据直接拷贝到它上面,之后我们会介绍如何使用临时缓冲来拷贝顶点数据到高性能内存中。首先修改顶点着色器,不要再在着色器代码中包括顶点数据。顶点着色器使用in关键字接收来自顶点缓冲的输入:#version 450#extension GL_AR...原创 2019-06-21 11:28:45 · 1489 阅读 · 4 评论 -
Vulkan教程 - 09 固定管线
固定管线老式图形API为多数图形管线提供了默认状态。而在Vulkan中你必须明确所有的东西,从视口大小到混合函数。本章我们会填充所有的结构体来配置这些固定管线操作。VkPipelineVertexInputStateCreateInfo结构体描述了将要传给顶点着色器的顶点数据的格式,它主要通过以下两种方式描述:绑定:数据间的距离以及数据是否是逐顶点或者逐实例的;属性描述:传给顶点着...原创 2019-06-17 20:01:51 · 1714 阅读 · 0 评论 -
Vulkan教程 - 04 物理设备与队列族
在通过VkInstance初始化Vulkan后,我们需要选择物理硬件也就是显卡来进行后面的工作了,在initVulkan方法中添加一个函数pickPhysicalDevice。我们选择的显卡存储在VkPhysicalDevice中,该对象会在VkInstance销毁后自动销毁,所以我们不用在cleanup中做操作。列出显卡和列出扩展一样,如下:uint32_t deviceCount = 0...原创 2019-05-30 11:04:57 · 1682 阅读 · 0 评论