[toc] # 主要步骤 # 初始化 用 D3D12CreateDevice 函数创建 ID3D12Device 接口实例。 创建一个 ID3D12Fence 对象,并查询描述符大小。 检测用户设备对 4x MSAA 质量级别的支持情况。 依次创建命令队列、命令列表分配器和主命令列表。 描述并创建交换链。 创建应用程序所需要的描述符堆。 调整后台缓冲区的大小,并为它创建渲染目标视图。 创建深度 / 模板缓冲区及与之关联的深度 / 模板视图。 创建视口 (viewport) 和裁剪矩形 (scissor rectangle)。 # Chapter4 渲染循环 等待 GPU...

[toc] # 引用 (放在最上面咯) [1] dividePoly [2] 从零开始学导航网格 [3] recastnavigation [4] critterai # 引言 Unity 中 navmesh 网格的生成就是通过 recast navigation 进行的。recastNavigation 构建的第一步就是对被烘焙对象的网格进行体素化。 而这个体素化就是本篇文章索要探讨的内容。 # 1. 高度场 什么是高度场?如下图所示是一个空间 图一。完整空间 将这个空间按照指定的 块大小 和 块高 进行分割,可以得到如下的区域划分: 图二。高度场 我们称这个空间划分的方式叫 高度场 #...

[toc] # 前言 CPU 与 GPU 通信的时候需要进行同步,但最好的情况是不要进行同步。让 CPU 和 GPU 都会最大的发挥性能 # 命令队列和命令列表 每个 GPU 都至少维护着一个命令队列 ( command queue ,本质上是环形缓冲区) 借助 Direct3D API,CPU 可以利用命令列表 ( command list ) 将命令提交到这个队列中去。 同异步消息处理的方法,命令会异步进行处理, 这里就会产生几个问题,如命令队列被填满时,CPU 需要等待,但如果 CPU 迟迟无法传递命令进来,就会导致 GPU 等待。 # 创建命令队列 填写...

[toc] # 组件对象模型 我们通常将 COM 视为一种接口,DirectX 通过使用引用计数的方法来管理这些组件占用的内存。 常用的三个和 COM 相关的方法如下: Get GetAddressOf Reset # 纹理格式 2D 纹理是一种由数据元素构成的矩阵。它的用途之一是存储 2D 图像数据,即每个元素存储的都是一像素的颜色。 但是,纹理贴图的用处并非只有贴图。例如,有种 法线贴图 的技术,其纹理内每个元素存储的是一个 3D...

[toc] # 开篇 虚幻引擎那么厉害的画面,是通过什么样的过程产生的呢? 首先,渲染系统的线程和游戏逻辑的线程是分开的,其次,渲染线程对图像的生成依赖于逻辑线程的 drawCall (提交)。 所以可以认为渲染引擎是附庸于游戏逻辑而存在的。 源码是 4.6 # 1. 获取渲染线程 PreInitPostStartupScreen -> RendringThread.StartRenderingThread() -> FRHIThread::Get().Start(); # FRHIThread (仅用在内部中) 这个类继承自 FRunnable...

颜色查找表,即将一个颜色映射到另一个颜色的方法 比如如下的颜色映射表 颜色查找表的映射算法通常是以 蓝色 的值来确定在哪个色块内,通过 红色 和 绿色 确定在当前这个色块内的坐标 即蓝色可以确定 UV 的 x 坐标的起始,但是不同的颜色查找表有不同的算法,有些查找表并非上图所示的一行,而是多行构成的 算法如下: 123456789101112131415161718192021222324252627282930#version 310 es#extension GL_GOOGLE_include_directive : enable#include...

[toc] # 调用时机 Vulkan_RHI 初始化完毕之后 # 数据结构 123456789101112131415struct PIBLResourceData{ void* _brdfLUT_texture_image_pixels; uint32_t _brdfLUT_texture_image_width; uint32_t _brdfLUT_texture_image_height; PILOT_PIXEL_FORMAT _brdfLUT_texture_image_format; std::array<void*, 6>...

# 前言 Vulkan 是 Pilot 中 RHI 的很大一块,Vulkan 在当前的认知中是多线程友好的一个图形接口 https://vulkan-tutorial.com/ # Multi-Threading in Vulkan https://community.arm.com/arm-community-blogs/b/graphics-gaming-and-vr-blog/posts/multi-threading-in-vulkan # 命令池 如上图所示,在 Vulkan 中每一帧对应一个 CommandPool, 每一个 CommandPool 中有很多...

[toc] Vulkan 实际上是应用和硬件之间的一个接口,对于 Vulkan 而言,Instance 会携带一个 Loader, 并且对其初始化,loader 负责加载驱动和 layers, 其中 Layers 一般用于错误校验,调试输出 # 构建 VulkanInstance - createInstance # 初始化 VkApplicationInfo 12345678// app infoVkApplicationInfo appInfo {};appInfo.sType =...

今天凌晨睡觉的时候做了一个很奇怪的梦,在做梦的时候感觉自己已经完全的沉浸了进去。为了记录下这个梦境,在睡醒之后就将它记录到了笔记本中。 但是在这段梦的最后,我想加一句话… 然后父亲转过身子,走了过来,"这是我为你做的一切,我欠你太多太多… 但你,一定要快乐…"