My Blogs

Unity中实现Volumetric Fog

Theory 我们无法模拟每个组成雾的粒子,但是我们尝试计算一个较小空间中雾粒子的密度,然后根据密度值来模拟粒子与光源的交互行为。如下图所示,当光线进入一个体积时,会发生以下几种情况: out-scattering:将光线散射回光源所在的方向 in-scattering:将光线散射到相机所在的方向 absorption:光线与组成雾的粒子交互所损失的能量 transmi...

Introduction to Turing Mesh Shaders

本篇博客翻译自这篇英伟达的文章 Motivation 在常规的渲染管线中,难以实现高效地绘制数亿个三角形与数十万个对象。而在使用mesh shader的情况下,原本的mesh会被分割为更小的meshlets,每个meshlet在理想情况下优化了其内部的顶点复用,从而减少不必要的重复加载与顶点数据的处理,以提高图形渲染的效率。 比方说,用于CAD的数据可能包含了数千万到数亿个三角形,即...

Writing an efficient Vulkan renderer

Abstract Vulkan是一个高性能、跨平台的图形API。但是要实现一个高性能的Vulkan程序,需要我们深入了解Vulkan中的各种概念。我们将在这篇文章中探讨如内存分配、描述符集管理、命令缓冲区记录、管线屏障、Render Pass等主题。最后还会讨论一些优化CPU与GPU性能的方法。 Memory management 在Vulkan中,我们需要手动分配内存以创建资源。...

Working with Modern Vulkan

Understanding Vulkan’s memory model 在Vulkan中,内存的管理与分配至关重要。但是Vulkan只负责决定分配内存的确切内存地址,除此以外所有的细节都由应用程序负责。也就是说,作为开发者,我们需要自行管理内存类型、内存大小、对齐方式以及任何子分配。这种设计方式为应用程序提供了更大程度的内存管理控制,允许开发者针对特定用途优化程序。 在本小节中,我们将会...

Material System in Filament

1 Standard model 我们材质模型的目标是描述标准材质外观。从数学上,材质模型通过BSDF(双向散射分布函数)表述,该函数由BRDF(双向反射分布函数)与BTDF(双向透射分布函数)共同构成。 由于聚焦常见表面类型,标准材质模型将重点处理BRDF,对BTDF进行忽略或高度简化。因此,该标准模型仅能准确模拟具有短平均自由程的反射型、各向同性、介电或导电材质表面。其中,短平均自由...

URP中基于Depth Texture的空间重建

Motivation 很多后处理效果在实现时,只能从深度纹理中获取深度信息,而无法获取场景中几何体的顶点数据,但其实现方式又需要利用世界空间/相机空间中的坐标。这种情况下,我们就需要从深度纹理中重建世界空间坐标。此外,也有一些其他的重建选项,例如重建世界空间中的法线,或者相机空间中的位置。 无论我们要重建哪种信息,出发点都是深度纹理,我们通过屏幕空间的UV,采样得到当前像素对应的深度值,...

Perspective Correct Interpolation and Vertex Attributes

为什么需要透视矫正 对于顶点属性来说,如果我们直接使用重心坐标,在投影三角形的表面上进行线性插值,会造成渲染结果的失真。这是因为,重心坐标是在二维空间中进行计算的,如果直接用重心坐标进行线性插值,实际上就忽略掉了透视投影引入的深度变化。 透视矫正的实现方法 要实现透视矫正,我们可以首先将顶点属性除以对应顶点的Z坐标,之后再进行线性插值。