Working with Modern Vulkan
Understanding Vulkan’s memory model 在Vulkan中,内存的管理与分配至关重要。但是Vulkan只负责决定分配内存的确切内存地址,除此以外所有的细节都由应用程序负责。也就是说,作为开发者,我们需要自行管理内存类型、内存大小、对齐方式以及任何子分配。这种设计方式为应用程序提供了更大程度的内存管理控制,允许开发者针对特定用途优化程序。 在本小节中,我们将会...
Understanding Vulkan’s memory model 在Vulkan中,内存的管理与分配至关重要。但是Vulkan只负责决定分配内存的确切内存地址,除此以外所有的细节都由应用程序负责。也就是说,作为开发者,我们需要自行管理内存类型、内存大小、对齐方式以及任何子分配。这种设计方式为应用程序提供了更大程度的内存管理控制,允许开发者针对特定用途优化程序。 在本小节中,我们将会...
本篇博客是《The Modern Vulkan Cookbook》的第一章的读书笔记。主要涵盖了Vulkan中的一些核心概念。 Vulkan Objects 在本小节,我们将会了解什么是Vulkan的对象,以及Vulkan对象之间是如何相互联系的。 Vulkan中的对象是一些“黑盒”的句柄,并且对象类型都以Vk为前缀命名,例如VkInstance,VkDevice。有些对象需要其他...
1 Standard model 我们材质模型的目标是描述标准材质外观。从数学上,材质模型通过BSDF(双向散射分布函数)表述,该函数由BRDF(双向反射分布函数)与BTDF(双向透射分布函数)共同构成。 由于聚焦常见表面类型,标准材质模型将重点处理BRDF,对BTDF进行忽略或高度简化。因此,该标准模型仅能准确模拟具有短平均自由程的反射型、各向同性、介电或导电材质表面。其中,短平均自由...
1 VkInstance VkInstance可以视为Vulkan API与应用程序之间的连接,其核心作用是管理全局Vulkan状态,如启用的扩展、Layer等。 创建VkInstance时,需要我们指定VkApplicationInfo(包括应用程序的名称、版本、API版本),以及启用哪些扩展与Layer: void Context::createInstance() { /...
Motivation 很多后处理效果在实现时,只能从深度纹理中获取深度信息,而无法获取场景中几何体的顶点数据,但其实现方式又需要利用世界空间/相机空间中的坐标。这种情况下,我们就需要从深度纹理中重建世界空间坐标。此外,也有一些其他的重建选项,例如重建世界空间中的法线,或者相机空间中的位置。 无论我们要重建哪种信息,出发点都是深度纹理,我们通过屏幕空间的UV,采样得到当前像素对应的深度值,...
Optimizing the Edge Function 我们首先回顾一下edge function的实现: float edgeFunction(const Vec2 &a, const Vec2 &b, const Vec2 &c) { return (c[0] - a[0]) * (b[1] - a[1]) - (c[1] - a[1]) * (b[...
为什么需要透视矫正 对于顶点属性来说,如果我们直接使用重心坐标,在投影三角形的表面上进行线性插值,会造成渲染结果的失真。这是因为,重心坐标是在二维空间中进行计算的,如果直接用重心坐标进行线性插值,实际上就忽略掉了透视投影引入的深度变化。 透视矫正的实现方法 要实现透视矫正,我们可以首先将顶点属性除以对应顶点的Z坐标,之后再进行线性插值。
当像素与三角形重叠时,我们将其视为与三角形表面上一点重叠。当然,一个像素可能会有多个点重叠,此时我们的解决办法是比较与像素重叠的每一个点的深度值,找出距离相机最近的点。这样,我们就可以引出depth buffer这个概念了。它是一个与frame buffer尺寸相同的二维浮点数数组,它用于在光栅化过程中记录物体的深度值。 Finding Z by Interpolation dept...
Rasterization: What Are We Trying to Solve? 经过投影阶段,我们获取了三角形的顶点在二维栅格空间中的XY坐标,同时我们还保留了相机空间中顶点原始的Z坐标(包括取反以获取一个正数) 我们下一步需要做的是遍历图像中的像素,通过测试是否像素会与当前三角形的投影图形重叠,我们可以绘制出该三角形的图像,这也是光栅化的原理。如下图所示: 在图形API中...
Quick Review 我们可以将光栅化算法分为两个部分: Project Stage:将三角形顶点投影到canvas上 Rasterization Stage:光栅化三角形,也就是将三角形拆分为像素的过程。 我们将各用一篇博客来深入两个部分,本篇博客先探讨Projection Stage。 在本篇博客中的主要内容如下: 回顾顶点的变换过程 探讨投影相关的新...