自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 GAMES103——作业1 刚体碰撞

线速度受到重力的影响,因此每次更新都要加上重力造成的速度影响,同时还需要乘上速度的衰减量。先求出物体于某个姿态时的惯性张量,而下面的推导告诉了我们,可以预计算初始姿态的惯性张量,想要求某个姿态的惯性张量时,再使用R乘入即可。对于平行于平面方向的速度,根据库伦摩擦定律 F=μN,水平方向速度的改变量是由摩擦力F造成的。N是竖直方向施加的力的大小,而这里 dt * N / m 刚好对应了竖直方向的速度变化量,因此就能得到第一条式子。对于速度的更新,采用显式的方法,对于位置的更新,采用隐式的方法。

2024-09-10 16:06:57 1227

原创 Unity Shader实现简单的各向异性渲染(采用各向异性形式的GGX分布)

最近刚结束GAMES202的学习,准备慢慢过渡到GAMES103。GAMES103的作业框架为Unity,并没有接触过,因此准备先学一点Unity的使用。刚好101和202都是渲染相关的,因此先学习使用Unity的Shader。Unity的Shader采用了HLSL,与GLSL不同的地方挺多(写过202的作业,对GLSL印象不怎么好)。最喜欢的地方就是对于材质,它有一个面板,新建一个材质属性,可以自己方便地调节参数,不用在代码里修改。而GLSL想要使用和调节新的参数,还需要在Shader外部作修改。

2024-09-08 22:14:31 2538

原创 GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

根据上面的式子,能够求出世界坐标系在上一帧的屏幕坐标的位置。如果在屏幕内,判断是否为同一个物体,如果不是就不能采用上一帧的信息,否则会造成拖影现象。如果不存在,说明该像素不能以上一帧进行参考,将α设置为1,只用自己这一帧。由于没有学过信号与系统,这里我的简单理解是离得越远,点的贡献就越小,那么在远的地方就选一个点来代表其附近区域的贡献。这里实现比较简单,直接根据给出的联合双边滤波核的公式就能实现。采用加速降噪后,并使用帧的投影与累积生成的结果。采用加速降噪后,并使用帧的投影与累积生成的结果。

2024-09-03 21:23:23 683

原创 GAMES202——作业4 Kulla-Conty BRDF(BRDF的预计算、重要性采样)

因为Mircofacet模型只涉及一次的光线弹射,当物体很粗糙时,一根光线很容易会与表面发生多次作用,Mircofacet忽略了这一点,因此粗糙度大的物体,渲染结果会有点暗。假设入射光为1,那么损失的能量是1-E(μ),因为BRDF的对称性,因此需要考虑入射与出射方向。但是1-E(μ)是<0的,多乘一次,会变得更小,使得损失的能量计算错误,因此需要在补一项,最终得到下面的式子。,并将原来的式子中的cosθ移到了dθ里,因此变成sinθd(sinθ),将sinθ换元成μ,就得到了最终上面的式子。

2024-09-03 16:27:27 1319

原创 GAMES202——作业3 Screen Space Ray Tracing(间接光照)

该函数是计算diffuse材质的BSDF的,功能简单,其实就是之前101的内容。另外提一下,这里的INV_PI是PI的倒数,因为在计算机里乘法计算比除法计算更快,因此预定义一个INV_PI能加速渲染。按照202课上的原理,在着色点的位置开始,以某个方向射出光线,一步步向前试探找到交点。有交点的条件是:试探的点的深度比屏幕空间的该位置的深度更深(也就是在屏幕空间一直走直到被遮挡住,这时候说明有交点)。调试反射的结果,上面彩色格子的是正方体的面,这里反射的是地板的光。下面灰色的是地板面,反射的是正方体的光照。

2024-08-31 01:40:45 996

原创 GAMES202——作业2 Precomputed Radiance Transfer(预计算辐射度传输、球谐光照、球谐函数旋转)

​​​​​​​对于下面的Original三个形状,可以将其看作为某一种颜色在各个方向上的分布。也就是说,只需要九个系数,就能把一张贴图的六个面这么复杂的光照给表示出来。任何一个系数,都是各个方向上的光照投影到其对应的球谐函数上的值。左图为shadowed材质的结果,右图为interreflection的2次bounce的结果,可以看到部分区域因为计算了间接光照,明亮了很多。有交点说明被遮挡,V为0。使用上面的公式,因为l和T两项都已经预计算好了,只需要将传入的数据在顶点着色器中进行相乘与求和即可。

2024-08-29 16:48:50 3184

原创 GAMES202——作业1 实时阴影(ShadowMap,PCF,PCSS)

获取对周围的随机采样方向,乘以采样半径大小再除以贴图大小即可求得采样点在贴图中的位置。方法,第一次先以光源为视点位置,将光源能看见的所有物体进行光栅化,并将以深度值进行绘制的结果保存到帧缓冲区,帧缓冲区的内容写入纹理。第二次绘制,根据纹理和一个将世界坐标下的点转化到以光源为视点的坐标系的矩阵,判断是否被遮挡,从而实现硬阴影。因为是计算遮挡物的平均深度,所以没有遮挡物的话,返回-1处理,有遮挡物返回遮挡物的平均深度,而不是返回整个采样区域的平均深度。如果查到的深度比现在的点的深度小,说明现在的点被遮挡。

2024-08-28 20:50:25 1502

原创 GAMES101——作业7 路径追踪 (含提高:多线程,微平面理论)

是法线分布函数,它解释了在观看者角度反射光的微平面的比例。需要注意的一点是,如果纯按照这里的伪代码来写,最后的结果光源的位置是纯黑的,需要再加一段判断射线是否击中光源的代码。以长方体和正方体的场景为例,设置spp为1,不采用多线程时,消耗了14秒的时间,当采用多线程时(这里采用24线程),所消耗的时间仅为3秒。:是菲涅尔函数,它解释了菲涅耳效应,该效应使得与表面成较高的入射角的光线会以更高的镜面反射率进行反射。菲涅尔函数的精确计算与近似,这里直接采用了作业框架自带的函数来求精确的菲涅尔函数的值。

2024-08-19 21:36:26 1516

原创 微平面理论cook-torrance BRDF的推导

写完发现自己的字怎么这么丑。

2024-08-18 22:21:35 442

原创 GAMES101——作业6 光线追踪加速(含提高:SAH方法)

实现原理是课上讲的方法,对每一个轴都计算一次tmin和tmax,tmin是光线进入包围盒某一个轴的时间,tmax是光线离开包围盒某一个轴的时间,计算完三个轴的时间后,对t_enter是max{tmin},t_exit是min(tmax),只有当t_enter<t_exit并且t_exit >=0时才算光线经过包围盒。可以很明显的看到,使用SAH方法构建树的时间开销很大,但是使用其划分出来的BVH树加速光线追踪会比默认的快,但是由于作业中给的场景不复杂,因此光线追踪所消耗的时间变化不太能感觉出来。

2024-08-18 16:40:45 860

原创 GAMES101——作业5 光线与三角形相交(菲涅尔反射率)

和相机的距离可以通过视角的大小的一半的正切值求出。像素坐标左上角为(0,0),范围是x∈[0,1],y∈[0,1],而图像坐标原点则为正中心,先转化成NDC坐标,坐标范围是x∈[-1,1],y∈[-1,1],再通过宽高比计算出图像的坐标,x∈[-width/2,width/2],y∈[-height/2,height/2],因此我们先计算出像素中心点的图像坐标。在这里我们要做的就是将像素的位置变换成像素在空间的坐标,然后根据像素在空间的坐标和相机的坐标,得到该像素对应的光线,从而实现光线追踪。

2024-08-17 16:54:26 2539

原创 GAMES101——作业4 Bézier 曲线(含提高:反走样)

这里考虑周围的3*3空间,每个像素点的中心点到该点的距离。可以很容易得出,最大距离为3√3/2,最短距离为0,因此可以按照这个比例,求出每个像素点到该点的距离后,再根据距离计算颜色的权重。(因为有一些像素会被重复计算,因此为了实现反走样,新的像素颜色要和老的像素颜色比较,取最大值。recursive_bezier:该函数使用一个控制点序列和一个浮点数。本次的任务相比上一次简单。最后,将返回的点绘制在 OpenCV。的范围内进行迭代,并在每次迭代中使 t。,然后该函数将返回在。曲线上对应点的坐标。

2024-08-16 15:13:59 461

原创 GAMES101——作业3 Pipeline and Shading(含提高:双线性插值、导入其他模型)

这里的N是三角形的法线,永远向上,T是切线,B是N叉乘T得到的副切线。比如当法向量N的x,y,z坐标都是正数时,算出来的切向量T的x,y,z也都是正的,和法向量不垂直。切向量T和副切向量B不仅仅只和法向量N有关,还和uv有关,如果只和N有关的话,那么切向量其实我们可以指定任意方向,这样算出来的结果法向量重新映射回坐标系就有无数种可能。修改main函数中对应的路径即可。根据相对高度的变化求导,得到法向量方向,将其归一化得到在TBN坐标下的方向,在根据上面的TBN矩阵,将其映射回原坐标就能得到最终结果。

2024-08-15 18:30:15 1441

原创 GAMES101——作业2 Triangles and Z-buffering(含提高:SSAA)

解决方法:在Rasterizer.h里根据原先定义好的frame_buffer和depth_buffer,自己定义一个四倍大小的SSAA_frame_buffer和SSAA_depth_buffer,对三角形光栅化的时候不对frame_buffer,全都采用SSA_frame_buffer和SSAA_depth_buffer,等到要马上要输出图像的时候,再将SSAA_frame_buffer里的像素分组求平均再赋给frame_buffer输出。将加工后的顶点组装成三角形,用于下一步的光栅化。

2024-08-14 21:28:37 1255

原创 GAMES101——作业1 旋转与投影(含提高:罗德里格斯旋转公式)

zNear是近平面到摄像机的距离,已知视角,可以根据正切函数求出一半的高度,最后乘2就可以得到近平面的高度,根据宽高比,求出近平面的宽度。再根据推导出的矩阵,代入数据即可求得所需的结果。所有的和数学有关的推导,这里不再说明,基本直接套用结果,不清楚可以重新看一遍games101的课程对应的知识。之后的文章亦是如此。修改后的模型矩阵函数,这里绕着指定的轴(0.5000,0.2000,0.8426)旋转。绕x,y,z轴的变换矩阵如下,算出两个三角函数值后直接代入即可。轴旋转的变换矩阵,而不用处理平移与缩放。

2024-08-13 23:48:47 765

原创 WebGL拖动控制点绘制贝塞尔曲线——以三次贝塞尔曲线为例

通过发生mousedown事件后遍历控制点数组,判断点击的位置是否和某个点的距离小于一定值,选择第一个满足条件的控制点,并向canvas绑定mousemove事件。为鼠标移动时,将选择的点颜色的R分量改为1.0,即点变为红色,修改点的X和Y坐标为鼠标在画布中的坐标。为了实现该功能,这里将功能分成两部分。第一部分是控制点的拖动功能,第二部分是贝塞尔曲线的绘制功能。通过向canvas绑定mouseup事件,解绑mousemove即可。:鼠标按下选择点->鼠标移动修改点->鼠标松开释放点。

2024-08-04 17:53:34 506

原创 计算机图形学——实验二几何图形变换实验

这里采用glMatrix的mat4里的相关功能,如生成平移矩阵mat4.translate(),生成旋转矩阵mat4.rotateX(),生成缩放矩阵mat4.scale(),矩阵乘法mat4.multiply()等来进行图形变换操作。正三棱锥四个顶点坐标可以取 ( 0.0, 0.0, -1.0 ), ( 0.0, 0.942809, 0.333333 ), ( -0.816497, -0.471405, 0.333333 ), ( 0.816497, -0.471405, 0.333333 )。

2024-07-31 16:08:54 1111

原创 计算机图形学——实验一 WebGL基本图形绘制

任务3:对canvas画布进行onclick事件绑定,发生点击事件后,通过点击事件的坐标,计算出点击的点在画布中的坐标{ (x,y)|x∈[-1,1],y∈[-1,1] },并将该点记录到indices数组中。设置三个改变颜色的button,点击后会向着色器程序传入对应的颜色数据,并进行重新绘制。注:由于只有实验相关的文档,给我提供文档的人没有给我相关的示例代码,因此所有的程序都是自己编写,非常可能与示例程序有较大出入,但是实现的原理基本一致。任务1:最基本的webgl在canvas上进行图形绘制操作。

2024-07-30 18:00:16 918

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除