Writing an efficient Vulkan renderer
Abstract Vulkan是一个高性能、跨平台的图形API。但是要实现一个高性能的Vulkan程序,需要我们深入了解Vulkan中的各种概念。我们将在这篇文章中探讨如内存分配、描述符集管理、命令缓冲区记录、管线屏障、Render Pass等主题。最后还会讨论一些优化CPU与GPU性能的方法。 Memory management 在Vulkan中,我们需要手动分配内存以创建资源。...
Abstract Vulkan是一个高性能、跨平台的图形API。但是要实现一个高性能的Vulkan程序,需要我们深入了解Vulkan中的各种概念。我们将在这篇文章中探讨如内存分配、描述符集管理、命令缓冲区记录、管线屏障、Render Pass等主题。最后还会讨论一些优化CPU与GPU性能的方法。 Memory management 在Vulkan中,我们需要手动分配内存以创建资源。...
Understanding Vulkan’s memory model 在Vulkan中,内存的管理与分配至关重要。但是Vulkan只负责决定分配内存的确切内存地址,除此以外所有的细节都由应用程序负责。也就是说,作为开发者,我们需要自行管理内存类型、内存大小、对齐方式以及任何子分配。这种设计方式为应用程序提供了更大程度的内存管理控制,允许开发者针对特定用途优化程序。 在本小节中,我们将会...
本篇博客是《The Modern Vulkan Cookbook》的第一章的读书笔记。主要涵盖了Vulkan中的一些核心概念。 Vulkan Objects 在本小节,我们将会了解什么是Vulkan的对象,以及Vulkan对象之间是如何相互联系的。 Vulkan中的对象是一些“黑盒”的句柄,并且对象类型都以Vk为前缀命名,例如VkInstance,VkDevice。有些对象需要其他...
本篇博客所讨论的光源及其实现以光线追踪为前提 Introduction to Lighting in 3D Rendering 在计算机图形学中,想要模拟光线与场景中物体的交互,我们需要考虑以下几个方面: 对于光源来说,采样点是否在阴影中,即采样点是否可见 如果采样点可见,如何计算光源对于采样点的贡献值 我们来依次讨论 Determining Whether the ...
Concept of BRDF 在众多的着色模型中,shading functions都围绕两个变量展开:入射光线的方向与观察方向。由此我们可以给出一个抽象的数学表达式: [f_R(\omega_o, \omega_i)] 其中,$\omega_o$与$\omega_i$分别表示观察方向与入射方向和shading point处法线向量的夹角。 在计算机图形学中,我们将这个函数称为双向...
Filament中的光照分为两部分: Direct Lighting:punctual lights, photometric lights, area lights Indirect Lighting:IBL 1 Units 在本篇博客中,我们会使用到如下符号与单位: Photometric term Notation ...
1 Standard model 我们所要使用的材质系统在数学上由BSDF双向散射分布函数描述,而BSDF本身又由另外两个函数组成:BRDF双向反射函数与BTDF双向透射函数。由于我们的目标是对常见的表面进行建模,所有我们的标准模型会专注于BRDF,而忽视BTDF,或者在某种程度上近似BTDF,因此,我们的标准模型只能正确地模拟短均自由程的反射性、各向同性的电介质或导电表面。 BRDF可...
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坐标,之后再进行线性插值。