自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

翻译 012 FAQ

本页列出了你在开发 Vulkan 应用程序时可能遇到的常见问题的解决方案。

2025-06-13 11:37:45 132

翻译 011Compute shader

在本章中,我们学习了如何使用计算着色器将工作从 CPU 转移到 GPU。如果没有计算着色器,现代游戏和应用程序中的许多效果要么无法实现,要么运行速度会慢得多。但计算的用例比图形更广泛,本章仅让你大致了解其可能性。共享内存异步计算原子操作子组你可以在 Khronos Vulkan官方示例库中找到一些高级计算示例。

2025-06-13 11:31:10 122

翻译 010 Multisampling

为了达到这一点,我们付出了很多努力,但现在你终于为编写 Vulkan 程序打下了良好的基础。推送常量实例化渲染动态统一变量独立图像和采样器描述符管线缓存多线程命令缓冲区生成多个子通道计算着色器当前程序可以通过多种方式进行扩展,例如添加光照、后处理效果和阴影映射。你应该能够从其他 API 的教程中了解这些效果的工作原理,因为尽管 Vulkan 具有显式性,但许多概念的工作原理仍然相同。

2025-06-13 10:14:26 42

翻译 009生成mipmaps

Mipmaps 在游戏和渲染软件中被广泛使用,而 Vulkan 让我们能够完全控制它们的创建方式。通常情况下,它们是预先生成的,并与基础级别一起存储在纹理文件中,以提高加载速度。级别非常方便,但遗憾的是,它并不能保证在所有平台上都受支持。除法之前,我们会检查每个维度,以确保该维度不会变为 0。使用较小的图像可以提高渲染速度,并避免诸如摩尔条纹之类的伪影。被视为传输操作,因此我们必须告知 Vulkan 我们打算将纹理图像同时用作传输的源和目标。的 Z 维度必须为 1,因为 2D 图像的深度为 1。

2025-06-13 09:51:08 60

翻译 008 Loading models

在本章中,我们将从 OBJ 模型加载网格数据,但我们将更多地关注如何将网格数据与程序本身集成,而不是从文件加载网格数据的细节。你的程序现在已经准备好渲染带纹理的 3D 网格了,但顶点和索引数组中当前的几何体还不够有趣。在本章中,我们将扩展程序,使其能够从实际模型文件中加载顶点和索引,从而使显卡真正发挥作用。容器包含所有单独的对象及其面。在本章中,我们暂时不会启用光照,因此使用已将光照烘焙到纹理中的示例模型会有所帮助。如上所述,OBJ 文件中的面实际上可以包含任意数量的顶点,而我们的应用程序只能渲染三角形。

2025-06-13 08:37:38 68

翻译 007 Depth buffering

深度缓冲区是一个附加附件,用于存储每个位置的深度,就像颜色附件存储每个位置的颜色一样。深度图像首先在早期片段测试流水线阶段被访问,由于我们有一个清除操作的加载操作,因此我们应该指定写入操作的访问掩码。格式,因为这种格式非常常见(请参阅硬件数据库),但如果可能的话,为我们的应用程序增加一些额外的灵活性也是不错的选择。每个交换链图像的颜色附件各不相同,但所有交换链图像都可以使用相同的深度图像,因为我们的信号量使得同一时间只有一个子通道在运行。我们遵循“深度越低,距离越近”的惯例,因此新片段的深度应该越小。

2025-06-12 18:53:58 58

翻译 006纹理映射

图像可以具有不同的布局,这会影响像素在内存中的组织方式。我们将首先创建一个暂存资源,并用像素数据填充它,然后将其复制到最终用于渲染的图像对象中。当然,你的应用程序的美术风格可能更符合左侧风格(比如《我的世界》),但在传统的图形应用程序中,右侧风格更受青睐。然而,在我们的例子中,我们首先将图像转换为传输目标,然后将纹素数据从缓冲区对象复制到该目标,因此我们不需要此属性,可以安全地使用。之后,我们将为顶点着色器添加纹理坐标,并修改片段着色器,使其从纹理中读取颜色,而不仅仅是对顶点颜色进行插值。

2025-06-12 11:33:46 66

翻译 005 Uniform buffer

描述符集指定了将绑定到描述符的实际缓冲区或图像资源,就像帧缓冲区指定了要绑定到渲染通道附件的实际图像视图一样。在下一章中,我们将为着色器指定包含 UBO 数据的缓冲区,但我们需要先创建这个缓冲区。因此,我们需要拥有与正在运行的帧数相同的统一缓冲区数量,并将数据写入当前未被 GPU 读取的统一缓冲区。在本例中,我们将为运行中的每个帧创建一个描述符集,所有描述符集都具有相同的布局。指定数组中值的数量。我们需要提供着色器中用于创建管线的每个描述符绑定的详细信息,就像我们对每个顶点属性及其位置索引所做的那样。

2025-06-12 09:50:55 88

翻译 004 Vertex buffer

需要注意的是,在实际应用中,你不应该为每个单独的缓冲区调用。同时分配内存的最大数量受物理设备限制的限制,即使在 NVIDIA GTX 1080 等高端硬件上,该限制也可能低至4096。同时为大量对象分配内存的正确方法是创建一个自定义分配器,该分配器使用我们在许多函数中见过的偏移参数,将单个分配拆分到多个不同的对象中。你可以自己实现这样的分配器,也可以使用 GPUOpen 计划提供的库。但是,对于本教程来说,可以为每个资源使用单独的分配,因为目前我们不会接近这些限制中的任何一个。

2025-06-12 08:07:51 77

翻译 003画一个三角形04交换链重建

理论上,交换链图像格式在应用程序的生命周期内可能会发生变化,例如,将窗口从标准范围移动到高动态范围显示器时。然而,这种方法的缺点是,我们需要在创建新的交换链之前停止所有渲染。这样,如果我们提前返回,栅栏仍然会收到信号,并且下次使用同一个栅栏对象时,在这种情况下,如果交换链不够理想,我们也会重新创建交换链,因为我们想要获得最佳结果。如果交换链不够理想,你也可以这样做,但在这种情况下,我选择继续操作,因为我们已经获取了图像。中,我们已经查询了新的窗口分辨率,以确保交换链图像具有(新的)正确大小,因此无需修改。

2025-06-11 20:52:57 57

翻译 003画一个三角形03绘制

等待上一帧完成从交换链获取图像记录一个命令缓冲区,将场景绘制到该图像上提交 记录的命令缓冲区呈现交换链图像虽然我们将在后续章节中扩展绘制函数,但目前这是我们渲染循环的核心。

2025-06-11 20:32:47 56

翻译 003画一个三角形02图形管线基础

这两个命令告诉编译器读取 GLSL 源文件并使用-o(输出)标志输出 SPIR-V 字节码文件。如果你的着色器包含语法错误,那么编译器会像你预期的那样告诉你行号和问题所在。例如,尝试省略分号,然后重新运行编译脚本。还可以尝试不带任何参数运行编译器,看看它支持哪些类型的标志。例如,它还可以将字节码输出为人类可读的格式,以便你可以准确地看到着色器正在执行的操作以及在此阶段应用的任何优化。在命令行上编译着色器是最直接的选项之一,也是我们将在本教程中使用的选项,但你也可以直接从你自己的代码编译着色器。

2025-06-11 18:53:00 81

翻译 003画一个三角形01Presentation

队列的具体工作方式以及从队列呈现图像的条件 取决于 swap chain 的设置方式,但 swap chain 的一般用途是将图像的呈现与屏幕的刷新率同步。需要注意的是,正如我们在上一章中提到的,演示队列的可用性意味着必须支持 swap chain 扩展。在本章中,我们将讨论第一个扩展,即。请记住,我们只指定了 swapchain 中图像的最小数量,因此实现可以创建包含更多图像的 swapchain。请注意,这些最终很可能会成为同一个队列族,但在整个程序中,为了统一方法,我们会将它们视为单独的队列。

2025-06-11 14:53:44 66

翻译 003画一个三角形00基础代码

在上一章中,你已创建了一个包含所有正确配置的 Vulkan 项目,并使用示例代码对其进行了测试。在本章中,我们将从头开始,使用以下代码:我们首先从 LunarG SDK 中引入 Vulkan 头文件,它提供了函数、结构体和枚举。 和 头文件用于报告和传播错误。 头文件提供了 和 宏。程序本身被封装到一个类中,我们将 Vulkan 对象存储为私有类成员,并添加用于初始化每个对象的函数,这些函数将从 函数中调用。一切准备就绪后,我们将进入主循环开始渲染帧。我们将在 函数中添加一个循环,该循环将一

2025-06-10 21:14:53 87

翻译 002开发环境

在本章中,我们将设置 Vulkan 应用程序的开发环境并安装一些有用的库。我们将使用的所有工具(编译器除外)都兼容 Windows、Linux 和 MacOS,但安装步骤略有不同,因此本文将分别介绍它们。

2025-06-10 18:45:38 67

翻译 001概述

这篇快速教程应该能让你对绘制第一个三角形所需的工作有一个基本的了解。实际的程序包含更多步骤,例如分配顶点缓冲区、创建统一缓冲区以及上传纹理图像,这些步骤将在后续章节中介绍。但由于 Vulkan 本身的学习曲线就比较陡峭,所以我们先从简单的开始。需要注意的是,我们会稍微“作弊”,首先将顶点坐标嵌入到顶点着色器中,而不是使用顶点缓冲区。这是因为管理顶点缓冲区需要先熟悉命令缓冲区。创建 VkInstance选择支持的显卡 (VkPhysicalDevice)

2025-06-10 17:31:26 67

翻译 000引言

这个新接口让你能够更好地描述应用程序的预期功能,与 OpenGL 和 Direct3D 等现有 API 相比,这可以带来更佳的性能,并减少驱动程序的意外行为。同样重要的是,一旦你完成了那个看起来枯燥乏味的三角形,绘制带有完整纹理的 3D 模型就不再需要太多额外的工作,而且在此之后的每一步都会带来更大的回报。但是,如果你使用的是 C++,你可能更喜欢使用较新的 Vulkan-Hpp 绑定,它可以抽象一些脏活并有助于防止某些类别的错误。然而,这些优势的代价是你必须使用一个更加冗长的 API。

2025-06-10 13:10:48 37

原创 Shadow Mapping、BlinnPhong、PCF、PCSS

从研一才开始入门图形学…不过接触后很喜欢,所以创建此系列,记录相关算法实现。先打个草稿发下看看,后期会完善。以上代码是在GAMES202课程作业代码框架下完成。

2025-05-27 13:25:19 167

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除