- 博客(50)
- 收藏
- 关注
原创 GPU Pro 5 - 5.3 Managing Transformations in Hierarchy 笔记
个人笔记,仅供参考层级结构中的变换管理有游戏引擎的使用经验的话Hierarchy应该相当熟悉,这篇文章主要讲述的是3D引擎中如何将场景中的对象组织成一颗树形结构,并管理对象之间的空间关系。常用的方式是通过使用TRS系统,T:Translation,R:Rotation,S:ScaleTRS系统所需要处理的第一个问题是如何将一个世界矩阵重新分解回TRS。事实证明,这个问题不存在一完全稳健的通解,但存在一种近似分解算法,能够在绝大多数实际应用场景中取得较好的效果。
2026-08-07 20:14:46
172
原创 GPU PRO 5 - 5.2 glTF: Designing an Open-Standard Runtime Asset Format笔记
这里可以看到,一个office.bin 文件被划分为两个bufferView,Buffer表示一整块连续的二进制数据,BufferView则是其中的一段数据,可以用于划分不同用途的数据块。这篇文章主要是提倡另一种资源文件格式,用来给开发者提供一个统一的基础,将美术资源格式转换到统一的渲染引擎在运行时使用的资源格式,文章给这种资源文件格式的名字是。定义完每种美术资源如何在glTF的保存后,接下来需要了解的是如何从统一的美术资源格式。2,开放协作,包括GitHub,社区,Markdown,Issue跟踪。
2026-07-29 20:18:42
185
原创 GPU PRO 5 - 5.1 Quaternions Revisited 笔记
四元数插值存在方向的问题,如果两个四元数点积为正则会沿着最短路径进行,否则会沿着最长路径进行,对于三角形内部的顶点法线通常希望用最短路径去插值。用四元数可以用更少的数值完成变换矩阵的作用,变换矩阵需要位置、旋转、缩放 每个四个共12个数值来表示,但是用四元数仅仅需要8个数值即可。既然是通过顶点插值来实现,那么同样就可以把每个顶点的TBN转换成四元数,然后再套用之前说的四元数插值,以及对齐的办法代替。文章中对此的处理是不直接混合四元数,而是先用骨骼四元数分别计算顶点变换,再对变换后的顶点位置按权重进行混合。
2026-07-25 21:25:23
241
原创 GPU PRO 5 - 4.7 Optimizing OpenCL Kernels for the ARM Mali-T600 GPUs 笔记
这篇文章应该是面向GPU底层开发人员的,本文主要讲述的是如何针对 ARM Mali-T600 系列 GPU 的架构特点,在使用 OpenCL Kernel 上进行性能优化。矩阵计算的时候被乘矩阵应该可以用转置矩阵替换,这是因为缓存从内存读取矩阵数据的时候是按矩阵行读取,为了后续计算时提高缓存的命中率文章中指出将其中一个矩阵换为转置后的矩阵。Kernel 中应该保持A指令和LS指令数量的平衡,这个主要可能是因为三流水线设计的原理,最佳比例是A :LS = 2 :1。2,减少内存的访问次数。
2026-07-20 21:33:52
208
原创 GPU PRO 5 - 4.6 Adaptive Scalable Texture Compression 笔记
而ASTC中,每个块都可以存储最多4个顶点(正方形的四个角)的颜色,并根据从预设的颜色计算公式中挑选合适的算法保存。基于块的意思是对数据的处理都是基于Block的,也就是图片会被分割成很多的大小相同的小的Block,然后一个Block的数据会被用更少的数据表示,压缩后的数据也只用来表示这个Block的数据。ASTC 是 ARM 公司开发的一种纹理压缩格式,其目标是为此前种类繁杂、灵活性不足的纹理压缩格式提供一种统一且灵活的解决方案。它是一种基于块的纹理压缩算法。但是解压缩的时间是固定的。
2026-07-13 11:36:10
171
原创 GPU PRO 5 - 4.5 Tiled Deferred Blending 笔记
核心思路还是使用多重纹理代替多次渲染上,现代渲染管线中,在不考虑合批等操作下,每个物体都会在片元/像素 Pass 进行采样对应的一个纹理进行颜色计算,并在后续流程进行混合。Tile 有个优点就是同一个位置可以加入多个Tile片,当Pass支持的纹理小于当前Tile存在的纹理数量时,可以划分多几个Tile来渲染。2,对于每个Sprite,找到他覆盖到的Tile,将sprite的ID存储到受影响的Tile的列表中。5,对于每个非空的Tile,每个片元利用插值后的纹理坐标采样绑定的纹理,并手动完成颜色混合。
2026-07-10 15:27:59
245
原创 GPU PRO 5 - 4.4 Efficient Morph Target Animation Using OpenGL ES 3.0 笔记
本笔记仅为个人的理解,如果有误欢迎指出。Efficient Morph Target Animation Using OpenGL ES 3.0利用 OpenGL ES 3.0 实现高效的 Morph Target 动画 这篇文章主要介绍了利用OpenGL ES 3.0 新引入的 Transform Feedback(变换反馈),在移动端设备上实现的Morph Target 动画方案。 Morph Target 动画的另一个名字叫做混合动画,指的是美术人员在离线阶段预先制作模型的
2026-07-08 22:52:31
242
原创 GPU PRO 5 - 4.3 Bandwidth Efficient Graphics with ARM Mali GPUs 笔记
这个实现原理是因为在移动端设备中,片段着色器写入的不是framebuffer,写入的是Tile Buffer,而Tile Buffer不是在显存中所以几乎没有额外的带宽消耗。这个拓展允许片段着色器读取现有的framebuffer 深度和模板值,这使得许多依赖场景深度的屏幕空间技术可以实现,比如软粒子、可编程深度\模板测试、三维位置重建以及方差阴影贴图。提供的一系列拓展技术,感觉像是API介绍说明,这篇文章不像是面向普通的游戏开发人员看的,像是给游戏引擎开发看的。本笔记仅为个人的理解,如果有误欢迎指出。
2026-07-01 22:11:30
256
原创 GPU PRO 5 - 4.2 Deferred Rendering Techniques on Mobile Devices 笔记
第二步:这一阶段对于屏幕上的每一个像素首先会根据Light Index Texture上的光源索引,通过这个光源索引去查询存储了光源信息的纹理,比如光源位置纹理、光源颜色纹理、光源衰减纹理等,最终再结合应用程序传入的漫反射纹理、法线等着色数据信息渲染出最终的颜色。延迟渲染对物体的渲染一般会有两个Pass以上,第一个Pass中会将这些数据写入到G-buffer中,随后在另外一个单独的光照计算的Pass中针对场景中的每一个光源依次读取G-buffer中的数据并混合,最终累积得到最后的光照。
2026-06-29 22:30:55
237
原创 GPU PRO 5 - 4.1 Realistic Real-Time Skin Rendering on Mobile 笔记
利用一个屏幕分辨率1/4大小的Buffer作为光照累积缓冲区,将渲染场景中所有使用皮肤着色的角色入射光计算结果都存储到缓冲区中,然后在该Buffer进行一次高斯模糊用于模拟光线在皮肤内扩撒效果。查找表存储4项:R通道存储 N·H 值,G 通道存储 N·V 值,B 通道存储预计算 Fresnel 项 ,A通道存储被镜面反射拿走之后,仍然留给漫反射的能量。文章表示皮肤的BRDF计算是最耗时的部分,这里可以用LUT优化,两个维度分别为:(法线与半角向量夹角)和 (法线与视线夹角)。
2026-06-25 21:49:20
245
原创 GPU PRO 5 - 3.3 Bokeh Effects on the SPU 笔记
本文讲述的是一种通过sprite实现的散景方案,并将其应用到PlayStation 3 的 协同处理单元(Synergistic Processing Unit,SPU)这样利用滤波核计算出每个像素的亮度后,如果该像素亮度高于某个阈值(threshold),就在该像素对应的屏幕空间位置生成一个纹理精灵(sprite)算法思路很简单通过分析每个像素的亮度,如果高于阈值就在对应位置生成一个sprite模拟散射效果。这里的优化方案是降低遍历用的分辨率以及选用小一些的滤波核。基于 SPU 的散景效果实现。
2026-06-09 21:39:17
251
原创 GPU PRO 5 - 3.2 Screen-Space Deformable Meshes via CSG with Per-Pixel Linked Lists 笔记
PPLL(Per-Pixel Linked List)像素链表的构建,这个结构是渲染领域非常常用的结构,以往的文章中也有描述比如。主要是对链表按照深度值排序,并根据M+与M-的交集情况将对应的深度值记录到最后的深度查找表上。,这里不同的是节点结构中多存了两个标志位,一个判断当前的片元是M+还是M-网格,一个判断当前片元是前向面还是后向面。局限性在于都是通过深度剔除,依赖多次渲染Pass,并和场景复杂度相关,场景越复杂通道数越多。以该图为例,M+为正常渲染的网格,M-为变形网格,M-的区域的像素会被裁剪。
2026-06-07 16:54:26
236
原创 GPU PRO 5 - 3.1 Screen-Space Grass 笔记
文章渲染草地的思路很简单,作者并没有真正生成草的几何体,而是在屏幕空间中把地形颜色颜色沿垂直方向拉伸,这会形成细长的纹理,所以在远处看起来会像草叶。文章模板测试中标记的只是地形,但是不是草地区域需要另外做区分,作者简单判断原像素是不是绿色来判断是不是草区域。有可能一些非地形组成部分的源像素被误处理,比如树木、路标、其他场景装饰物等等。这一部分主要为了标记屏幕空间中哪些区域是地形,或是哪些地方需要画草。文章中将地形的模板值设为了2,其他的物体的模板值设为了1。这一部分是文章草地渲染的核心。
2026-06-04 22:06:42
254
原创 GPU PRO 5 - 2.6 Wire Antialiasing 笔记
渲染的物体过小会带来一个问题就是相关的向量误差会越来越大,比如法线可能会因为像素变小而使得方向跳向了别的地方。因此与法线相关的光照模型在这些渲染上就不适用了,因此文章提出用法线变化带来的影响比较小的光照模型,比如半兰伯特光照模型。其实这里的思路类似于同书2.5章中头发的抗锯齿技术,也是通过计算覆盖率控制透明度的思路。解决这个问题的办法是将原本的电线粗细与拓展后的粗细计算出一个覆盖率,作为渲染像素的透明度值。但这会带来一个问题就是远处的电线会变粗,因为一个像素虽然小,但比起远处电线原来的大小还是会粗很多。
2026-06-03 22:27:49
289
原创 GPU PRO 5 - 2.5 TressFX: Advanced Real-Time Hair Rendering 笔记
头发渲染的初始数据是线段,在几何阶段时会将线段拓展成一个与视平面齐平的平面,也就是常见的公告板,投影后的毛发半径还会增加一些半径保证不会因为投影过小导致在光栅化阶段消失。这里的抗锯齿用的是基于覆盖率的毛发抗锯齿,计算当前像素被毛发覆盖的比例来决定当前像素毛发的Alpha 值,以此减少边缘的锯齿现象。最简单的方法,所有毛发的都同同一个深度,优点是简单,不用额外的Pass,不用额外的存储,缺点是效果差,会产生视觉伪影。在毛发渲染中,计算毛发的光照的时候需要考虑毛发的深度,文章中拓展了这部分内容。
2026-06-02 21:41:24
287
原创 GPU PRO 5 - 2.4 Hi-Z Screen-Space Cone-Traced Reflections 笔记
从代码的实现中可以了解到,他所计算的可见性是基于屏幕空间的,不是基于世界空间的,实现代码中只是简单的基于一个范围内最大最小深度的差值,与之前计算的可见性来评估当前计算的可见性。这一段主要讨论的是如何处理屏幕外的反射数据,屏幕空间反射的固有问题就是他的反射信息只能在屏幕空间内,反射步进到屏幕空间外的话是采样不到颜色信息的,文章表示通过控制淡出来掩盖这部分问题。这一段主要是考虑大深度场景,一般大世界的深度缓存为了提高超远距离的深度采用的是反转Z,即1 / Z 来代替,对应的Hi-Z也要对应修改。
2026-05-30 23:27:43
268
原创 GPU PRO 5 - 2.3 Volumetric Light Effects in Killzone: Shadow Fall 笔记
这样就获得了一个3D纹理查找表,在体积光步进计算光照量的时候通过深度就可以直接或当前位置的散射量,这样通过就可以通过控制切片的从而能在空间上控制体积光的效果。体积光和半透明物体因为渲染顺序的不同都会造成错误的遮挡,因为步进算法会考虑深度图,而半透明物体一般是不写入深度的,以至于在体积光计算的时候很难考虑的到半透明物体的影响。一半体积光计算的时候,每个像素点步进的幅度是一致的,文章中通过采样一个扰动贴图,让相邻的计算点步进幅度会有不同,以此减少整个计算过程中的步进数量。二,调整步进幅度,减少步进步数。
2026-05-27 23:42:52
413
原创 GPU PRO 5 - 2.2 High Performance Outdoor Light Scattering Using Epipolar Sampling 笔记
由于在极线采样的情况下我们只会对极线上对应的View Ray进行步进计算,那么对于这个极线上的View ray所构成的平面来说,他们所采样的阴影图的区域都是一样的,每条View ray上的步进点最终都是阴影图上某个线段面积。这个原理是如果当前要步进计算的线段AB深度完全小于节点中最小的深度,说明这一段都可以进行光照计算,反之则缩短接下来要步进的距离,或是如果全都在阴影处的话就跳过这一段的光照计算。可以看到,原本的算法中需要对屏幕每个像素点都进行光线步进,极线采样后需要进行光线步进的点就降低了几个数量级。
2026-05-24 20:35:00
241
原创 GPU PRO 5 - 2.1 Physically Based Area Lights 笔记
抽离的关键在于将粗糙度g'和着色点p的关系解绑,也就我在渲染着色点p的时候,我需要将当前着色点p的粗糙度g也作为查表的一个坐标。Li的值是可以通过离线预计算处理,在要用的时候通过查询一个三维表来获得,该表的三个维度坐标分别是光源空间中Pd的xy坐标和着色点与Pd之间的距离r。目前为止考虑的光源都是均匀光源,真实情况的光源可能是非均匀发光,因此需要对光源做一些处理,论文中提示用预积分的对整个光源变化进行预积分,再按照光源面积进行归一化。对于两个面积的求交,文章考虑了两种情况,一个是圆盘光源,一个是矩形光源。
2026-05-17 17:17:12
332
原创 GPU PRO 5 - 1.4 Simple Rasterization-Based Liquids 笔记
文章表示液体模拟是逐个计算粒子与粒子之间的相互作用力实现的,主打一个力大飞转。这种模拟方式需要对粒子做空间排序以方便查找周边粒子,而这篇文章则将每个粒子的属性投射到网格上,通过在网格上求解粒子间的动力学来简单模拟液体,因此免去了排序步骤也不需要去寻找邻接粒子。文章的背景是为了解决弱不可压缩模型下光滑粒子流体动力学(SPH)里模拟粒子行为时需要查找旁边粒子来计算作用力这个形式。这里的核心想法是:不是直接从网格上计算出新的值赋值给粒子,而是计算一个变化量给粒子。3,将计算好的结果反馈回粒子上调整粒子。
2026-04-22 21:51:43
218
原创 GPU PRO 5 - 1.3 Particle-Based Simulation of Material Aging 笔记
在粒子和表面的材质传输有两种类型,一种是从粒子里的材质更新到物体表面(PS_SurfaceUpdate),一种是从物体表面更新到粒子里(GS_GammatonUpdate)。代码上看就是将当前表面数据和粒子里面的材质数据进行混合,但有些不明白CUDA编程中是不是可以对物体材质数据进行读写的,因为在Unity渲染中贴图一般是在CPU中进行读写的,这里的CUDA流程应该是类似的。以上便是粒子模拟的大概流程,思路其实很简单,就是用CUDA每帧更新物体表面和粒子的材质数据,模拟粒子本质上也只是迭代更新数据。
2026-04-08 21:33:21
395
原创 GPU PRO 5 - 1.2 Reducing Texture Memory Usage by 2-Channel Color Encoding 笔记
RGB颜色空间可以表示为一个三维表示的立方体,一张纹理的所有颜色都分布在这个立方体之内,但是普通的纹理他所有像素在这个立方体中存在一定的空间关联性,具体来说在三维空间中可以找到一个平面,他与这张纹理的所有像素点都相对较近。这个颜色平面在RGB颜色空间中与边界交叉可以获得几个顶点,一个顶点是(0,0,0),与顶点相邻的两个顶点(bc1,bc2)则定义为该颜色平面的基色。文章主要的思想其实还是如何用一个颜色平面拟合一张在RGB空间下的纹理,这个平面才是能够双通道存储的核心,这里用的是最小二乘法进行的拟合。
2026-03-22 16:59:06
409
原创 GPU PRO 5 - 1.1 Per-Pixel Lists for Single Pass A-Buffer 笔记
当要把手上的盒子放到队列里的时候,我们先和队列里第一个盒子比较,如果位置上的盒子里的值比手上的盒子值小的时候,我将手上的盒子和当前位置的盒子交换,并且根据两个盒子的内容决定我下一次要去找哪个位置的盒子去比较。在PRE-SORT 中,插入排序需要在全局内存中完成,这样的操作会比较慢,但这个排序方法支持对不可见的片元提前剔除。在传统光栅化渲染半透明物体时,往往渲染的顺序十分重要,一般渲染半透明物体的时候都是从距离相机比较远的物体开始渲染,靠近相机的后渲染,从后往前叠加颜色来得到最终效果。
2026-03-07 15:58:01
507
原创 GPU PRO 4 - 6.2 Real-Time JPEG Compression Using DirectCompute 笔记
本笔记仅为个人的理解,如果有误欢迎指出。Real-Time JPEG Compression Using DirectCompute 使用DirectCompute实时JPEG压缩本文基于C++ 和 Direct3D 11.0 ,利用DirectCompute 对RGB数据进行JPEG压缩。整个文章分为两个部位:1,JPEG的主要流程以及原理2,DX11实现实例。
2026-02-12 18:30:18
599
原创 Unity基于自定义管线实现经典经验光照模型
SRP管线的好处就是任何渲染效果都可以自己去实现,坏处就是任何渲染效果都要自己去实现。本文在Catlike Coding 实现的基础上给出几个经典光照模型的Shader实现,Catlike Coding在这教程中使用的是PBR光照模型,网上常见的实现范例都是基于Unity预设的管线,这边给出这个教程框架下的实现。
2026-02-06 15:48:05
718
原创 GPU PRO 4 - 6.1 Bit-Trail Traversal for Stackless LBVH on DirectCompute 笔记
本笔记仅为个人的理解,如果有误欢迎指出。层次包围结构:这是一种树形的数据结构,一般常用于碰撞检测,游戏引擎中将场景的物体进行划分的时候就会将物体都划分成一个一个包围盒,由此生成了一个树形结构线性的层次包围结构:LBVH是一种使用了Morton Code(位交错编码/莫顿码)线性构建的BVH结构,一般LBVH的使用对象是网格上的三角形,LBVH用每个三角形的三个顶点坐标计算出三角形的重心坐标,再将三角形重心坐标通过Morton Code映射成一串编码,再根据每个三角形编码的相似性进行包围层次包围结构的划分。
2026-02-03 01:51:53
651
原创 Unity 实现一个简单的构建机
这只是一个简单的技术实现,很多技术细节还相当毛糙,不少地方都是硬编码,但只要流程都跑通了后续功能都可以自行添加。
2026-01-28 21:16:36
446
原创 GPU PRO 4 - 5.3 A Pipeline for Authored Structural Damage 笔记
本笔记仅为个人的理解,如果有误欢迎指出A Pipeline for Authored Structural Damage 一个可人工设计的结构破坏管线Authored Structural Damage :人工的结构破坏,指的是美工手工制作的被破坏结构的细节,比如断肢的残面,建筑被破坏后暴露的钢筋之类的。为了表现角色和建筑的破坏效果,传统的方式是使用贴花(decal)技术,比如弹痕。但是这种技术表现不了结构变化类型的破坏,比如断肢,身体的孔洞,建筑被轰炸后造成的孔洞之类的。
2026-01-24 11:32:38
618
原创 GPU PRO 4 - 5.2 Kinect Programming with Direct3D 11 笔记
本笔记仅为个人的理解,如果有误欢迎指出Kinect Programming with Direct3D 11 用DX11在Kinect编程这篇文章,比起技术性文档,更像是一篇Kinect的说明文,价值不高。
2026-01-19 22:23:34
390
原创 GPU PRO 4 - 5.1 An Aspect-Based Engine Architecture 笔记
本文更像是讲述的一种在数据高度集中的情况下如何将各个功能在引擎层面中封装成模块,这种引擎的特点就是数据被管理到引擎核心中,功能模块化后对于引擎的修改会更加方便,因为只需要关注当前模块的功能即可。这边文章个人觉得理解难度不高,涉及的技术难点也不多。【什么是面向切面编程AOP?- 欲眼熊猫的回答 - 知乎】【在Unity中简单使用AOP为方法添加自定义属性】【DOTS 技术深度解析】
2026-01-18 18:21:50
1346
1
原创 GPU PRO 4 - 4.1 Real-Time Deep Shadow Maps 笔记
本笔记仅为个人的理解,如果有误欢迎指出Real-Time Deep Shadow Maps 实时深度阴影贴图在离线渲染中渲染半透明物体的时候会使用到一种深度阴影贴图的东西辅助渲染,例如头发以及烟雾的阴影渲染,本篇文章提供了一种在实时渲染中生成并应用深度阴影贴图的方法,依赖DX11 的API。一张阴影贴图是光源点为视角,观察不透明物体时生成的深度图,但这张贴图一般是不会考虑半透明物体的,深度阴影贴图中则是专门考量半透明物体对阴影影响,具体影响数值由下面这个公式得出。
2026-01-11 18:42:59
1055
原创 GPU PRO 4 - 3.5 Coherence-Enhancing Filtering on the GPU 笔记
流程从一张灰度图或者颜色图输入开始,每次迭代的时候进行流引导平滑和冲击过滤锐化,并在执行前进行一次局部方向估计,锐化后会进行一次边缘平滑再输出图像,用来展现每次迭代的效果。算法的核心是局部方向估计 (Local Orientation Estimation),用来获取当前像素位置的方向信息,他由平滑后的结构张量的特征值分析得到。b, Shock Filter 冲击过滤 一种锐化过滤方法,能把纹理插值平滑地变换成陡峭的变换。本文讲述的是一种图像处理办法,能够将图像处理成类似梵高或爱德华·蒙克的绘画风格。
2025-12-29 21:51:29
146
原创 GPU PRO 4 - 3.4 Practical Framebuffer Compression 笔记
结合后文理解,通过同时采样四周围的点来计算当前点的颜色从而近似复原出原图,T 代表阈值 Li 代表每个采样点通道中的Y,从而计算出每个采样点对当前点混合比例wi,进而混合出当前点的【Y Co Cg】信息,再通过颜色转换公式计算出【R G B】信息。颜色转换公式中,RGB -> YCoCg 是线性转换的,那么混合也可以是线性的,但需要留意的是转换后的YCoCg的值范围是[-0.5 , 0.5] 保存到缓冲里面的时候加了0.5 映射到[0,1] ,混合的时候需要留意。本笔记仅为个人的理解,如果有误欢迎指出。
2025-12-20 16:26:34
181
原创 Unity基于自定义管线实现屏幕空间反射(SSR)
本文在Catlike Coding 实现的基础上参考了知乎文章增加了屏幕空间反射(SSR)功能,并给出相关步骤。
2025-12-12 17:50:28
1282
原创 GPU PRO 4 - 3.3 Second-Depth Antialiasing 笔记
可以看到,在这个情况中两个边缘并没有交点,褶皱边的计算方式无法生效,这个时候,通过记录浅蓝色边的深度,计算得到交点A,在用A点的位置作为参考决定如何去做混合颜色的比例。而浅蓝色边的深度,主要通过shader渲染中反向利用剔除物体背后这个机制来获取。也就是说第二层深度纹理指的是面向摄像机的物体的背面的深度。褶皱边这种情况,通过两个边交点A ,与距离B、C两点的比例作为权值,来混合两边的颜色。本文讲述的是一种在后期处理的时候通过另一层深度纹理优化轮廓边的抗锯齿效果。本笔记仅为个人的理解,如果有误欢迎指出。
2025-12-09 21:59:06
197
原创 Unity基于自定义管线实现风格化草
本文基于Unity 2022.3.18f1和CustomSRP2.5.0管线,参考Roystan的GrassShader实现风格化草地渲染。
2025-11-11 16:55:29
1023
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅