球谐函数SH与PRT 函数分解和SH对于任意函数 $f(x)$,不管是连续的还是不连续的,我们可以展开成一系列基函数(每项都带某个系数)的线性组合: f(x)=\sum_{i} c_{i} \cdot B_{i}(x) 比如傅里叶变换是利用不同频率余弦波近似一个函数的,还有一种球谐的方法,听到他的球字我们就知道它非常适合拟合球面内容,这非常适合拟合环境光贴图或者其他球形分布的内容。 SH有不同阶数, 2024-07-27 图形学 球谐函数 环境光照 PRT
游戏中的剔除技术 游戏中的剔除技术 剔除是个比较大的工程,方法众多,同时剔除的目标的粒度也不同,下面我们介绍一下常见的提出技术,有些是软件上的技术(ComputeShader也算软件,非专用硬件电路剔除的都算软件剔除),有些是硬件上的技术,我们会分开来介绍。 一般来看,我们是根据粗粒度逐渐进行剔除的,这一点在GPU-Driven pipeline中可以很明显看出,我们从粗粒度上大概分成以下几种: 对obj 2024-07-27 图形学 剔除技术
C++中安全又便捷的Swap-and-Copy-Idiom Swap-and-copy idiom什么是swap and copy?我们考虑每次实现 拷贝赋值/移动赋值 函数时是很麻烦的,需要考虑很多东西,例如浅拷贝/深拷贝,例如要写big-five等。 swap-and-copy idiom 优雅地帮助赋值操作符实现两件事: 避免代码冗余:不再写拷贝赋值/移动赋值 函数, 移动构造函数也可以直接用swap来写 并提供强大的异常保证。 从概念上讲,它 2024-07-27 C++ SwapAndCopyIdiom 强异常安全性
阴影技术(2)——CSM 背景 在传统的shadow map方法下,如果场景很大,一眼过去可能几百米都零散分布着阴影,若shadow map贴图太小,则锯齿很明显,想提高精度就要增大shadow map贴图,然而内存开销就会过大。 Cascade Shadow Map(CSM) 借鉴了 LOD 的思想,对主摄像机的视锥体范围进行了划分,然后对每个划分区域采用相同分辨率大小的 Shadow Map,这意味着 2024-07-19 图形学 阴影 CSM
GPU-Driven Rendering Pipeline CPU在管线中一般做些什么? GPU算力提升后远超CPU,我们希望把CPU端的计算放在GPU端,这也是行业一直在努力的方向。 考虑一个传统管线,往往是一个个object来渲染,而在CPU端意味着你需要做这么几件事情: 选择LOD 根据object的AABB/Sphere Bounding等进行视锥剔除/远距离剔除/遮挡剔除。 设置PSO 最后做一次DrawCall 传统下怎么 2024-07-19 图形学 GPU-Driven-Rendering-Pipeline
阴影技术(1)——朴素Shadowmap,PCF,PCSS Shadow Mapping与常见问题The Most Basic Method Of Shadow Mapping 对于阴影生成, 首先需要额外设置一个摄像机在光源位置(Light Camera,光源摄像机),并且朝光照方向看去。用一张纹理贴图(也称阴影贴图,Shadow Map)来记录Light Camera所看到的像素深度。 在主渲染流程时,对每一个着色点进行着色时,需要比 2024-07-19 图形学 阴影 PCF PCSS ShadowMap
反走样技术(1)——SSAA,MSAA,TAA SSAA(SuperSampling AntiAliasing)超采样反走样SSAA首先是模糊,然后把一个像素分成多份(比如$2*2$四份),会对每一个pixel的subpixel都进行shading(着色计算)。 最后这个pixel的颜色等于四个subpixel的颜色的加权和。 MSAA(MultiSampling Anti-Aliasing)多重采样反走样很全面的MSAA解释 https:/ 2024-07-16 图形学 反走样 SSAA MSAA TAA
漫谈C++中的重定义:ODR,inline,static,extern 漫谈C++中的重定义:ODR,inline,static,extern 首先加了inline不会一定内敛,甚至inline原本的建议内联的作用已经没什么作用了,现在的编译器已经足够智能,能够自己决定是否内联。 先了解ODR 和 extern/static这一节主要理解一下几个概念 什么是ODR 什么是一个翻译单元 定义和声明的区别 extern关键字帮助我们把definition变为 2024-06-12 C++ ODR inline static extern
现代C++和内存模型视角下理解虚函数 现代C++和内存模型视角下理解虚函数虚函数速度慢在哪里 函数调用多一层: 虚函数调用比普通函数多了一个查询虚表,获取虚函数入口的步骤,比普通的函数调用要更耗时。 难做编译器优化: 具体调用哪个虚函数是运行时状态决定的,编译器很难做一些优化,比如PGO,自动inline,RVO等,当然这个在某些特殊情况下不是的,可以看”2.虚函数不一定是运行期才绑定“ 虚函数真的就那么慢吗?它的开销究竟在哪里?来 2024-06-12 C++ 虚函数