- 博客(13)
- 资源 (48)
- 收藏
- 关注
原创 Vulkan教程 - 17 描述符与内存对齐
之前章节的描述符布局描述了描述符可以绑定的类型。本章我们要对每个VkBuffer资源创建一个描述符集合来将它绑定到统一缓冲描述符上。描述符集合不能够直接创建,必须从一个池中分配,就和命令缓冲一样。同样的,对应也有描述符池。写一个新方法createDescriptorPool来建立它,把它放在初始化Vulkan的创建统一缓冲之后:createUniformBuffers();create...
2019-06-26 20:34:17 1876 4
原创 Vulkan教程 - 16 MVP与统一缓冲对象
我们现在能为每个顶点传输任意属性到顶点着色器了,但是用全局变量怎么样呢?我们本章要转移到3D图形上,这要求Model-View-Projection矩阵,也就是MVP矩阵(模型-视口-投影矩阵)。 我们可以将它包括进来作为顶点数据,但是这比较浪费内存,也要求我们在它的变换改变的时候更新顶点缓冲,而变换是很可能在每一帧都改变的。Vulkan中正确处理该问题的方法是使用资源描述符。描述符是着色器能...
2019-06-26 11:37:56 1000
原创 Vulkan教程 - 15 索引缓冲
顶点缓冲已经能正常工作了,但是让我们能够从CPU访问的内存类型可能对显卡本身读取来说不是最优的。最好的内存会有VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT标记,且通常在专用显卡上不可以用CPU访问。本章我们创建两个顶点缓冲,一个位于CPU可访问内存中的临时缓冲来上传来自顶点数组的数据,一个设备本地内存中的最终的顶点缓冲。我们使用缓冲复制命令来移动数据,从临时缓冲移动到实际...
2019-06-24 20:40:08 500
原创 Vulkan教程 - 14 顶点缓冲
接下来几章,我们会使用内存中的顶点缓冲替换掉顶点着色器中的硬编码顶点数据。我们用最简单的方式开始,创建一个CPU可见的缓冲,使用memcpy来将顶点数据直接拷贝到它上面,之后我们会介绍如何使用临时缓冲来拷贝顶点数据到高性能内存中。首先修改顶点着色器,不要再在着色器代码中包括顶点数据。顶点着色器使用in关键字接收来自顶点缓冲的输入:#version 450#extension GL_AR...
2019-06-21 11:28:45 1299 4
原创 Vulkan教程 - 13 重建交换链
现在我们的程序能成功绘制三角形了,但是还有一些情况,它还不能很好地处理。窗口表面可能会改变,导致交换链与其不兼容。这种事情发生的可能原因之一是窗口的大小改变了。我们要能抓取这些事件,然后重建交换链。创建一个recreateSwapChain方法,它会调用createSwapChain以及为依赖交换链或者窗口大小的对象调用所有创建方法。void recreateSwapChain() {...
2019-06-20 20:31:51 685
原创 Vulkan教程 - 12 栅栏和信号量
这一章所有东西都会整合到一起了。我们将会写一个drawFrame方法,它会被主循环调用,将三角形呈现到屏幕上。创建drawFrame方法在mainLoop的while内处理事件后调用:void mainLoop() { while (!glfwWindowShouldClose(window)) { glfwPollEvents(); drawFram...
2019-06-19 19:47:27 1656
原创 Vulkan教程 - 11 帧缓冲和命令缓冲
帧缓冲我们前面的章节已经讨论很多了,而且我们已经建立了渲染通道,以便得到单个的帧缓冲,有着和交换链图像一样的格式,但是我们还没有真正创建什么东西呢。在渲染通道创建过程中指定的附件通过把它们包装成一个VkFramebuffer对象来绑定到一起。帧缓冲对象引用了所有表示附件的VkImageView对象。我们这里就一个附件,即颜色附件。但是,我们为了这个附件要用的图像依赖于当我们获取图像用于呈现的时...
2019-06-18 17:30:11 694
原创 Vulkan教程 - 10 创建图形管线
在我们完成管线创建之前,我们需要告诉Vulkan渲染将要用到的帧缓冲附件的信息。我们需要明确有多少颜色和深度缓冲,每个又有多少采样以及它们的内容应该如何通过渲染操作来进行处理。所有这些信息都包装在渲染通道(render pass)对象中,我们就创建一个新的方法createRenderPass,在initVulkan中调用它,且它在createGraphicsPipeline之前。我们这里仅有一...
2019-06-18 16:18:00 1194
原创 Vulkan教程 - 09 固定管线
固定管线老式图形API为多数图形管线提供了默认状态。而在Vulkan中你必须明确所有的东西,从视口大小到混合函数。本章我们会填充所有的结构体来配置这些固定管线操作。VkPipelineVertexInputStateCreateInfo结构体描述了将要传给顶点着色器的顶点数据的格式,它主要通过以下两种方式描述:绑定:数据间的距离以及数据是否是逐顶点或者逐实例的;属性描述:传给顶点着...
2019-06-17 20:01:51 1274
原创 Vulkan教程 - 08 着色器及编译SPIR-V
着色器模块不像是之前的API,Vulkan着色器代码一定要用字节码格式,而不是人类可读的语法如GLSL和HLSL。这个字节码就是SPIR-V,设计用于Vulkan和OpenCL。这是一个可以用于编写图形和计算着色器的格式,但是我们主要关注的是Vulkan的图形管线。使用字节码格式的优点之一是GPU厂商写的编译器将着色器代码转化为原生代码会非常简单。过去的经验表明,人类易读的语法如GLSL,某些...
2019-06-10 17:25:24 4265
原创 Vulkan教程 - 07 图像视图和图形管线
图像视图使用任何的VkImage,包括在交换链中的,我们都要在渲染管线中创建VkImageView对象。图像视图描述了如何获取图像,获取图像的哪个部分,比如它是否应该被当作2D材质深度材质对待而没有任何mipmapping等级。本章我们写一个createImageViews方法,为交换链中每个图像创建一个基础图像视图,以便我们后续用来作为颜色目标。首先添加一个类成员存储图像视图:st...
2019-06-06 16:27:41 684
原创 Vulkan教程 - 06 交换链
Swap chain(交换链)现在到了Vulkan教程第十章了,学习交换链。Vulkan没有默认帧缓冲的概念,因此它需要一个基础设施,能够在我们通过屏幕看到内容之前,持有我们想要渲染的东西的缓冲。该基础设施就是交换链了,必须显式创建。交换链本质上是一个图像队列,等待显示到屏幕上。我们的应用将会获取这样的一个图片来向其进行绘制,然后将它返回给队列。队列究竟怎么工作的,以及从队列中呈现一个图像的条...
2019-06-05 17:17:02 1873
原创 Vulkan教程 - 05 逻辑设备与窗口表面
逻辑设备选择了物理设备后,我们需要建立逻辑设备来交互了。逻辑设备创建过程和实例创建过程类似,且描述了我们想要的特性。向类中添加一个新的成员变量存储逻辑设备句柄:VkDevice device;接着,添加函数createLogicalDevice以便在initVulkan中调用。创建逻辑设备涉及到在结构体中明确许多信息的操作,首先是设置VkDeviceQueueCreateInfo。该...
2019-06-03 20:09:20 1371 6
Unity Trail Renderer制作流星拖尾小例子
2019-03-29
Android Studio 和 Unity 交互并传递参数
2018-11-27
Qt登录及Nginx上传回调及Django上传服务器等
2018-11-19
基于HTTP的Qt下载上传研究
2018-11-06
Django前端模板及crispy form美化等
2018-10-25
Django用户及登录等学习整理
2018-10-22
图像修复及抠图等
2018-09-20
图像目标分割
2018-08-24
《深度学习: 一起玩转TensorLayer》页面正常 高清完整
2018-08-22
图像及深度学习笔记整理
2018-07-13
图像风格化再探
2018-06-06
图像风格化初探
2018-05-29
AndroidStudioUnity
2017-10-25
使用FFmpeg与Qt制作图形转码小工具
2017-09-27
使用FFmpeg和Qt制作图形化转码工具
2017-09-26
Django使用Mandrill发送邮件记录
2017-09-05
使用Tomcat或Nginx搭建视频服务器
2017-08-23
C#代码混淆
2017-07-28
Google Cardboard笔记
2017-03-14
UEFI及GPT安装Windows10和Ubuntu16双系统
2017-03-09
Ubuntu16双GTX1080配置CUDA8.0
2017-03-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人