- 博客(54)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 SPH(光滑粒子流体动力学)流体模拟实现六:Position Based Fluid(PBF)
SPH(光滑粒子流体动力学)流体模拟实现六:Position Based Fluid(PBF)
2021-02-02 18:18:10
3676
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 SPH(光滑粒子流体动力学)流体模拟实现七:屏幕空间流体渲染(SSF)
SPH(光滑粒子流体动力学)流体模拟实现七:屏幕空间流体渲染(SSF)之前都是用的Marching Cube重建流体表面的方法。近来为了做对比实验,尝试了屏幕空间流体渲染的方法。发现屏幕空间的方法不仅在效率上有极大的提升,效果也还是非常可观的,先上两张图:本文方法来自NYIDIA的文章“Screen Space Fluid Rendering for Games”。本文的流体粒子运动模拟方法使用的是前文的PBF方法,我们已经根据PBF计算完成粒子运动。利用粒子完成屏幕空间渲染的主题思..
2020-11-26 20:01:40
3993
14
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 实时体积云渲染(地平线):一.云的生成
实时体积云渲染(地平线):一.算法总览体积云一直是想尝试的一个东西,最近终于有点自己的时间,花了些功夫实现了“地平线”里用到的体积云算法。实现效果图如下(未加大气散射有空一定补上):Fredrik的论文"Real-time rendering of volumetric clouds"对地平线的体积云算法做了稍微的调整,算是写的真的非常清晰了,本文依照他的方法展开实现。算法总览算法主体思路非常简单明了,1:生成体积云,2:计算光照模型。生成体积云想要在天空中绘制体积云..
2020-09-28 17:13:33
3536
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 联级阴影贴图CSM(Cascaded shadow map)原理与实现
联级阴影贴图CSM(Cascaded shadow map)原理与实现CSM是利用分层的ShadowMap技术,实现大场景的阴影算法。示意图如下图:我们通过给眼视锥分片,为每个分片生成一个相同分辨率的光空间深度图。利用眼睛看到的片段,根据其所在分片位置,转换为相应光空间深度,和光空间深度图比对,若深度大于深度图内的深度,则处于阴影。该算法分为4个步骤:将眼视锥分成多个深度分片。 将光的视锥体分成多个较小的视锥体,每个视锥体(也可以称为包围盒)都覆盖一个分片。 为每个光视锥体.
2020-08-04 19:26:03
7425
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 快速傅立叶变换(FFT)的海面模拟
快速傅立叶(FFT)变换的海面模拟在这篇文章中,我们将根据Tessendorf的论文[1]中的方程来实现统计波浪模型,以模拟海洋水。 使用快速傅立叶变换,我们将能够实现实时交互的帧速率。以下提供两个截图,首先是简单的光照渲染,之后的是网格模型的渲染。改文章使用了一个高度函数,其中为坐标(x,z)(我们这里令y为高度),时间为t(说明我们的高度会随时间变化)。其中,是我们...
2019-12-18 14:13:14
4741
4
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 快速傅立叶变换(FFT)算法(原来这就是蝶形变换)
快速傅立叶变换(FFT)算法(原来这就是蝶形变换)为了实现FFT的海面模拟,不得不先撸个FFT算法实现。离散傅立叶变换(DFT)学习FFT之前,首先要先了解什么是DFT,我们都知道傅立叶变换是将时域转换为频域。但是我们计算机是没办法处理连续的点,因此就有了离散傅立叶变换DFT。标准DFT公式:我们令:W的一些性质证明: 证明方法同...
2019-12-09 22:21:15
24110
8
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 SPH(光滑粒子流体动力学)流体模拟实现四:各向异性(Anisotropic)表面光滑(1)
流体模拟四:各向异性(Anisotropic)表面光滑(1)表面的表示与定义我们是以隐式表面来表示流体表面。定义一个足够大的参考域,它完全包含粒子表示的流体所在的空间D,即。流体表面隐含的定义为空间函数的一个等值表面,即:另外,流体的内外区域可表示为:下图所示为隐式曲面表示表面示意图:其中,绿色表示曲线内,蓝色表示曲线外,颜色的深浅代表场强的大小,红色的...
2019-11-27 13:13:27
2129
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 等值线算法
等值线算法最近导师提了一个实现等值线算法的要求。在思考要怎么写的时候,突然想到表面重建就是重建的等值面,那来个降维打击,不就是等值线了嘛!等值线算法思路网上以及许多文章里的等值线算法都是基于三角形网格的算法,由于我项目的数据性质,我就使用正方形的网格算法,主要是方便编写哈哈。等值线算法主要步骤分为以下几步:构建网格,并为每个网格分配索引。 根据每个网格索引去索引边...
2019-11-05 15:10:52
8483
14
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 SPH(光滑粒子流体动力学)流体模拟实现:算法总览
流体模拟(一)流体模拟算法总体流程:流体现象广泛存在于自然界、日常生活以及工 业生产中,对流体的模拟即流体动画,一直是基于物理的动画以及计算机图形学的重要研究内容。目前,基于物理模拟的流体动画按照其空间离散化的不同方式主要分为两大类:网格法与无网格法。网格法将模拟域离散到网格点,而网格点的物理属性值(如速度、密度等)通过求解控制方程获得;无网格法则是将流体体积离散到采样粒子,每个粒...
2019-09-18 14:29:31
11403
8
原创 Forward Plus Rendering
文章中的方法来自“Forward+: Bringing Deferred Lighting to the Next Level”。文章介绍了Forward+,这是一种通过仅剔除和存储对像素有贡献的灯光来渲染多光源的方法。 Forward+ 是传统前向渲染的扩展。 使用 GPU 的计算能力实现的灯光剔除被添加到管道中以创建灯光列表; 该列表被传递到最终渲染着色器,它可以访问有关灯光的所有信息。实现方法Forward+ 通过在最终着色之前仅添加一个光剔除阶段来扩展前向渲染管道。 管道由三个阶段组成:
2021-10-01 21:04:39
1931
2
原创 Summed-Area Variance Soft Shadow Mapping(SAVSM):二
上文介绍的PCSS方法,其在平均遮挡物的计算和PCF需要大量的采样加权平均操作,如果半影区相当大,采样效率将相当低下。如果使用柏松圆盘进行固定步数采样,在较大的半影区情况下会出现明显的阴影分片伪影:SAVSM则使用了一种高效的手段,避免了多次的范围采样,无论多大的半影区,只需要进行一次采样即可获得平滑过度的阴影,效果如下:SAVSM...
2021-07-01 21:47:47
813
1
原创 Summed-Area Variance Soft Shadow Mapping(SAVSM):一
随着游戏质量提升,传统硬阴影逐渐的不再被人们接受,各种软阴影算法渐渐的出现在我们的视野当中,最为流行的几种软阴影方法为:Variance Shadow Map(VSM),Convolution Shadow Maps(CSM),Exponential Shadow Maps(ESM),Moments Shadow Map(MSM)以及Percentage Closer Soft Shadows(PCSS)。PCSS...
2021-06-29 16:21:35
526
原创 SPH(光滑粒子流体动力学)流体模拟实现五:PCISPH
SPH(光滑粒子流体动力学)流体模拟实现五:PCISPH我们知道真实的液体是不可压缩的,但我们在计算机中离散的计算流体运动,在一定的时间步长内,用标准的SPH方法求解,在在粒子聚集处容易发生挤压,造成压缩。有两种常用的方法模拟不可压缩性:1.在WCSPH(弱可压缩SPH)中,利用刚性状态方程(EOS)建模压力。2.通过求解压力泊松方程实现不可压缩性。但这两种方法都有很昂贵的计算费用。文章“Predictive-Corrective Incompressible SPH”中,提出了一种预测矫正的.
2020-11-03 15:41:17
6540
15
原创 B样条曲线介绍和实现(等值线平滑)
B样条曲线介绍和实现(等值线平滑)最近得到个任务是把之前的等值线光滑一下,思考良久决定用B样条去做平滑。虽然之前经常看到这个词条,但一直有正面接触,就趁着这次撸下来,做个总结吧。B样条曲线B样条是通过逼近一组控制点生成的曲线,它有如下计算表示:...
2020-07-08 16:34:16
8080
2
原创 光线求交加速算法:kd-树
光线求交加速算法:kd-树空间二分树,即Binary space partitioning(BSP)树利用分割平面自适应地细分空间。 BSP树以包围整个场景的边界框开始。如果框中的图元数量大于某个阈值,则该框将被平面分成两个区域。然后,将图元与它们重叠的区域相关联。如果图元同时位于两个区域,则图元将与两个区域都关联(这与BVH不同,在BVH中,每个图元在拆分后仅分配给两个子组之一)。拆分过程将递归地继续进行,直到树中的每个叶区域包含足够少的图元,或者直到达到最大深度为止。因为可以将拆分平面放..
2020-07-03 11:08:36
1277
原创 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)3-LBVH(Linear Bounding Volume Hierarchies)
光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)3尽管使用表面积启发式方法(SAH)构建边界体积层次结构会产生很好的结果,但是该方法确实存在两个缺点:首先,对场景图元进行了多次遍历,才能计算树的所有级别上的SAH成本。其次,自上而下的BVH构造很难很好地并行化:因为构造子树需要其父辈结点都创建完成,所以无法并行的构造子树。LBVH(Linear Bounding Volume Hierarchies)线性边界体积层次结构(LBVH)可以用来来解决.
2020-06-29 22:25:59
2251
1
原创 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2-表面积启发式法(The Surface Area Heuristic)
光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)2上篇的两种图元分区方法(Middle,EqualCounts)对于某些图元分布可以很好地工作,但是在实践中它们常常选择性能较差的区,从而导致光线访问树的更多节点,因此在渲染时不必要地降低了光线-图元相交的计算效率。当前用于构建射线追踪加速结构的最佳算法中,大多数都是基于“表面积启发式”(SAH)的。表面积启发式法(The Surface Area Heuristic)该算法提供了扎实的成本模型来估.
2020-06-28 19:59:26
2180
原创 光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)1-BVH引入
光线求交加速算法:边界体积层次结构(Bounding Volume Hierarchies)光线和物体求交的加速算法中,最常见的是物体(图元)细分和空间细分。边界体积层次结构(BVH)是一种基于图元(primitives)细分的光线相交加速方法,其中,图元被划分为不相交集的层次结构。 (相反,空间细分通常将空间划分为不相交集的层次结构。)下图显示了一个简单场景的边界框层次结构:其中,图元存储在叶中,每个节点存储其所有子节点图元的边界框。 因此,当光线穿过树时,只要它不与节点的边界相交,就可.
2020-06-28 15:12:53
2516
2
原创 球谐函数的概念与应用:球谐函数
球谐函数的概念与应用:球谐函数简介球谐函数性质和傅里叶级数性质类似,球谐函数也是以正交函数作为基底,傅里叶级数的正交基底为sin(nx)和cos(nx)。球谐函数则是球面上的正交基底。其主要性质有:标准正交性 旋转不变性 函数乘积的积分等于其球谐系数向量的点积标准正交性表示:其中,表示两组球谐函数基底。旋转不变性表示:函数乘积的积分等于其球谐系数向量的点积:我们列出球谐函数的表达式:我们可以把它理解为加工版的傅里叶级数正交基底。其...
2020-06-18 15:39:27
18970
12
原创 常用线性插值的介绍和应用(双线性插值,三线性插值,平滑曲线插值)
常用线性插值的介绍和应用线性插值插值是计算机图形学中非常常用的技术。通常,数据是在常规网格上指定的(值写在2D或3D网格的顶点位置)或在线上(在一维的情况下),但是程序需要在该网格上的随机位置求值。如果样本位于网格顶点上,那么我们可以简单地使用存储在网格顶点上的值。但是,如果样本位于网格上其他任何位置(单元中的某个位置),则考虑到那里没有数据,我们需要通过平均存储在单元顶点处的值来计算一个。这项技术称为插值,因为关键思想是在固定的网格位置“插值”现有值以计算网格上其他任何位置的值。在2D中.
2020-05-13 14:53:38
9688
2
原创 PBRT中的误差舍入管理(浮点运算)
PBRT中的误差舍入管理由于计算机二进制的特性,计算机不可能精确表示所有实数。计算机用浮点数来代替实数。浮点数有固定的存储要求,但是使用时始终会引入误差。在进行多次计算后,误差便会一直积累。在光线求交应用中,误差积累是很致命的。可能会导致完全遗漏有效的相交点,例如,即使精确的相交值为正,但计算出的相交点的值为负。此外,计算出的射线形状相交点可能在形状的实际表面之上或之下。如下图所示:可以发现当从阴影射线和反射射线计算出的交点开始跟踪新射线时,如果射线原点在实际表面以下,则可能会发现与该表面.
2020-05-12 15:54:20
707
原创 屏幕空间抗锯齿
屏幕空间抗锯齿由于我们光栅化的特性,三维世界的物体总会以二维的形式展示。我们的屏幕是由一颗颗方形像素点组成的,因此我们无法获得真正完美平滑的对象。我们只能够尽最大努力去处理像素点的采样,使其能够在视觉上有很好的光滑效果。光栅化是在屏幕空间完成的,因此我们抗锯齿的算法也基本都是在屏幕空间实现的,所以也叫基于屏幕的抗锯齿(Screen-Based Antialiasing)。最原始的像素采样就...
2020-05-08 14:18:53
720
原创 解构变换矩阵:如何使变换矩阵分解为位移(T),旋转(R),缩放(S)矩阵
解构变换矩阵给定一个转换的复合矩阵,关于组成该转换的任何单个转换的信息就会丢失。 我们如果有一个复合矩阵,怎么能使其分解为TRS三个矩阵呢?即如何完成下述变化:其中M是给定的变换矩阵,T是平移矩阵,R是旋转矩阵,S是缩放矩阵。其中提取T矩阵使非常简单的。因为我们知道平移矩阵形式为:所以我们可以通过M[0][3],M[1][3],M[2][3]来分别找到xyz的位移量。我们...
2020-04-27 15:26:53
7555
4
原创 超清晰KMP详解
KMP算法详解记得之前本科的时候看KMP每次都看的云里雾里,似懂非懂。今天再拿起来看一下,发现有了清晰的理解。NEXT数组想掌握KMP算法我们需要要非常了解这样一个数组。假设有一个字符串s,我们称s[0~i](i<s.size())为s的前缀,同样的后缀定义为s[j~s.size()-1]。其中i不能取到s.size()-1,j不能取1。举个例子:abcde:...
2020-04-24 21:11:22
283
原创 物体非等比缩放后的法线处理
物体非等比缩放后的法线处理物体经过非等比缩放时,法线不能直接乘上形变矩阵,因为:因为我们法线始终和物体表面切向量正交,所以有:当我们通过某个矩阵M变换表面上的点时,变换点处的新切向量t'为Mt。 对于某些4 * 4矩阵S,变换后的法线n'应该等于Sn。要保持正交性要求,我们必须:所以只有当(I位单位矩阵)才满足公式,所以我们有:所以S就是:这就是为...
2020-04-22 12:52:45
891
翻译 Whitted光线追踪实现
Whitted光线追踪实现Whitted光线追踪是的光线追踪中最经典示例之一。该技术由特纳·惠特(Turner Whitted)于1980年在Siggraph论文“用于阴影显示的改进的照明模型”中首次详细介绍。在Whitted撰写论文之前,大多数程序已经能够模拟漫反射和镜面反射的外观。著名的Phong照明模型已经众所周知。但是,模拟复杂的反射和折射尚未完成。 Whitted建议使用光线跟...
2020-04-20 21:46:38
3699
4
原创 PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现
PBR:双向反射分布函数(BRDF)介绍与Cook-Torrance模型的实现BRDF简介再介绍BRDF之前我们要引入渲染方程这个东西:其中L表示辐射率,其公式为:它表示了一个拥有辐射强度Φ的光源在单位面积A,单位立体角ω上的辐射出的总能量。辐射率是辐射度量学上表示一个区域平面上光线总量的物理量,它受到入射光线与平面法线间的夹角θ的余弦值cosθ的影响:当直接...
2020-04-12 20:43:36
9822
翻译 光线跟踪的几种常见求交运算
光线跟踪的几种常见求交运算我们知道光线跟踪中最昂贵的就是和几何对象的求交运算了。这里就记录几个比较常见的光线和几何对象求交运算。球射线与球体相交可能是射线几何相交测试的最简单形式,这就是为什么这么多射线追踪器显示球体图像的原因。 由于其简单性,它还具有非常快的优势。可以使用两种方法实施此测试。 第一个使用几何来解决问题。 第二种技术是我们最常用的方法,我们称它为代数法。这都...
2020-04-01 21:30:31
5536
1
翻译 光栅化的算法实现
光栅化的算法实现一直用OpenGL绘制东西的时候,就会想到我们在写可编程管线的时候,都是使用gl_position去保存一个物体经过model(模型矩阵)矩阵,view(视口)矩阵以及projection(投影)矩阵变换后的位置。然后利用该位置信息在片段着色器中为其上色并显示在屏幕上。这便是我们OpenGL实现光栅化的过程。那到底OpenGL底层是如何做到这一点呢?我们尝试着脱离Open...
2020-03-19 23:42:23
4456
1
翻译 重要性采样(Importance Sampling)简介和简单样例实现
重要性采样(Importance Sampling)在渲染领域,重要性采样这个术语是很常见的,但它究竟是什么呢?我们首先考虑这样的一种情况:如果场景里有一点P,我们想计算P点的最终颜色,根据全局照明的概念,P点的颜色是由所有投射到P点的所有光线所影响的。但是我们在利用蒙特卡洛积分去计算投射光线的总和会出现一个问题,如上图场景里有两盏灯,当蒙特卡洛采样较少的情况,可能导致灯光方向未...
2020-03-06 15:05:51
13741
翻译 蒙特卡洛积分(Monte Carlo Integration)应用:利用蒙特卡洛积分生成 McBeth表
蒙特卡洛积分(Monte Carlo Integration)应用蒙特卡洛积分通常函数f(x)的积分:可以解释为计算函数曲线下方的面积:而我们的蒙特卡洛积分则是通过近似的方式来获取一个函数的积分值。现在想象一下,我们只选取一个随机值,例如[a,b]范围内的x,对x处的函数f(x)求值,然后将结果乘以(b-a)。下图显示了结果:这是一个矩形(其中f(x)是...
2020-03-03 21:18:23
1646
翻译 蒙特卡洛(Monte Carlo)方法的介绍和应用
蒙特卡洛(Monte Carlo)方法的介绍和应用蒙特卡洛(Monte Carlo)方法在渲染中,我们经常听到术语“蒙特卡洛”(通常缩写为MC)。但是这是什么意思?实际上,它所指的是一个非常简单的想法,蒙特卡洛方法指的是一系列统计方法,这些方法本质上用于查找事物的解决方案,例如计算函数的期望值,或者对由于没有封闭形式而无法进行分析积分的函数进行积分。我们可以用该原理来解决不同的问题,...
2020-02-29 22:18:21
45473
4
原创 四元数和三维旋转
四元数和三维旋转在最初我们想在程序中旋转物体都会使用欧拉角方法。欧拉角包括偏航角(yaw)ψ,俯仰角(pitch)θ,滚转角(roll)ϕ。如下图所示:我们每次获取旋转时,需要分别对这三个角进行旋转来获得最终的旋转矩阵。但是欧拉角方法会有一个严重的问题,万向节死锁。产生这个问题的主要原因是,我们在旋转时会设置一个层级,会将这三个角排序,比如yaw->pitch->...
2020-02-20 20:17:39
2370
3
原创 GPU并行计算OpenCL(3)——图像处理
GPU并行计算OpenCL(3)——图像处理我们这一章来实现一下利用OpenCL完成一个简单的高斯过滤器处理图像,在实现图像处理之前,我们需要了解OpenCL中的图像对象和采样器对象。图像对象图像对象就是我们需要处理的图像,但是我们需要将其处理成OpenCL所理解的语言。这里我们可以使用FreeImage库来完成图像数据的处理,大大的减少了我们的工作量。图像对象封装了一个图...
2020-02-12 17:55:40
3698
2
原创 GPU并行计算OpenCL(2)——矩阵卷积
GPU并行计算OpenCL(2)——矩阵卷积我们完成了helloworld之后,会感慨一个helloworld就要2-3百行代码。但由于OpenCL需要完成一系列启用GPU并行计算的过程,所以我们之后许多编码会和helloworld十分类似。比如这次,我们将实现非常常见的功能,矩阵的卷积计算,该功能便可以体会到GPU并行计算的强大之处了。我们这次我们将输入信号作为一个矩阵,完成对信号的卷积...
2020-01-13 10:56:43
1520
原创 GPU并行计算OpenCL(1)——helloworld
GPU并行计算OpenCL(1)——helloworld随着现在GPU越来越强大,我们看论文的时候经常听到GPU加速的某某某算法,但是到底如何进行加速呢?CUDA可能大家更加熟悉(奈何电脑是MAC),这里介绍就OpenCL。OpenCL(Open Computing Langugae)是第一个面向异构系统(此系统中可由CPU,GPU或其它类型的处理器架构组成)的并行编程的开放式标准。它是跨...
2020-01-06 14:42:16
2160
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人