自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 C++使用TaggedPointer的方式实现高效编译时多态

特性传统虚函数 (Virtual Functions)Tagged Pointer (本例)多态类型运行时多态 (Runtime Polymorphism)编译时多态 (Compile-Time Polymorphism)核心机制虚函数表 (vtable)类型标签 (Type Tag) + Dispatch内存开销每个对象 1 个 vptr (虚函数表指针,通常 8 字节)。零开销。类本身就是 8 字节(一个指针大小)。它指向的对象 (等) 也不需要 vptr。性能开销间接调用 (Indirect Call

2025-11-10 16:14:23 887

原创 第十一章 模板

模板缓冲区是一种离屏缓冲区,我们可以通过它来阻止特定像素片段向后台缓冲区的渲染操作。由于模板缓冲区与深度缓冲区分辨率相同,所以两者可以联合使用。深度/模板缓冲区的有效格式为DXGI_FORMAT_D32_FLOAT_S8X24_UINT和DXGI_FORMAT_D24_UNORM_S8_UINT。

2025-10-08 15:59:29 991

原创 第十章 混合

我们在此帧画面时前后绘制了地形和木板箱,使这两种材质的像素数据都位于后台缓冲区中。接着再运用混合技术将水面绘制到后台缓冲区,令水的像素数据与地形以及板条箱这两种像素数据在后台缓冲区内相混合,构成可以透过水看到地形与板条箱的效果。

2025-10-04 22:13:40 653

原创 第九章 纹理贴图

DDS对于3D图形来说是一种理想的格式,因为它支持一些专用于3D图形的特殊格式以及纹理类型。从本质上来讲,它实为一种针对GPU而专门设计的图像格式。mipmapGPU能自行解压的压缩格式纹理数组立方体图(cube map,也有译作立方体贴图)体纹理(Volume texture,也有译作体积纹理、立方体纹理等)更节省磁盘空间DDS格式能够支援不同的像素格式。像素格式由枚举DXGI_FORMAT中的成员来表示,但是并非所有的格式都适用于DDS纹理。非压缩图像数据一般会采用下列格式。

2025-10-04 10:29:11 853

原创 第八章 光照

环境光模拟经表面反射的间接光量漫反射光:对进入介质内部,又经过表面下吸收而最终散射出表面光进行模拟。由于对表面下的散射光建模比较困难,我们便假设在表面下与介质相互作用后的光从进入表面处返回,并向各个方向均匀散射镜面光:模拟经菲涅耳效应与表面粗造度共同作用的表面反射光。得到direct12的光照方程:后面的镜面反射就是,模拟微表面模型,微表面的法线是h也就是直接的反射到我们眼睛的法线分布。R_{F}就是菲涅耳项,决定了多少能量直接反射(基于这个微表面的法线)。

2025-08-31 23:59:01 951

原创 第七章 利用Direct3D绘制几何体

CPU(除了要执行其它必要的工作)需要构建i提交命令列表,而GPU则负责处理命令队列中的各种命令。我们的目标是让CPU和GPU持续的工作,从而充分的利用硬件资源。为此提出了一个方案:以CPU每帧都需要更新的资源作为基本元素,创建一个环形数组。我们称这些资源为帧资源,而这种循环数组通常是由3个帧资源元素所构成。该方案的思路是:在处理第n帧的时候,CPU将周而复始地从帧资源数组中获取下一个可用的帧资源。趁着GPU还在处理此前帧之时,CPU将为第n帧更新资源,并构建提交对应的命令队列。随后,CPU会继续针对第n+

2025-08-23 16:48:53 689

原创 Direct12第六章

第五章是概念,第六章就开始实际的操作。

2025-08-05 23:35:30 630

原创 移植pbrt中的并行化到ray trace in weeks中

整个复现pbrt的代码,劝退性太高了,我的做法是根据raytrace in weeks 的系列去做一个修改首先是解决raytrace in weeks中渲染太慢的问题,因为他是一个像素一个像素处理的。

2025-07-27 22:09:24 696

原创 第四章 计时与动画与应用程序框架

为了制作出精准的动画效果就需要精准地计量时间,特别是要精准地度量动画每帧画面之间的时间间隔。如果帧率较高,帧间时间就会较短,因此需要使用高精度的计时器。

2025-06-16 00:14:43 1006

原创 The graphics rendering pipeline

实时渲染主要分为四个阶段:应用程序阶段、几何处理阶段、光栅化阶段和像素处理阶段。

2025-05-19 14:58:23 679

原创 GPU Gems1-Effective Water Simulation from Physical Models

这里主要是看上面的内容,我主要写一下我的疑惑点:首先是下面的方程3,我认为这就是说多个正弦函数叠加近似得到的高度场函数。

2025-05-11 21:22:33 337

原创 第四章-初始化Direct3D

首先我们需要一个错误检测和抛出机制下面是我的整体结构。

2025-05-07 00:07:52 1255

原创 CPU与GPU之间的交互

或者另外一个场景,我们一般利用swapchain进行前后帧交替渲染,也就是每一帧的渲染目标不同,我们都是呈现一帧渲染一帧,那么此时的描述符指向的framebuffer就不同,我们就需要锁的概念,比如我们可以将framebuffer设置为targetrendering的状态来写framebuffer。上面的代码只是加入了命令列表,调用ExecuteCommandLists以后才算是加入了命令队列,当命令都被加入了命令列表以后,我们必须调用下面的方法来关闭命令列表。通过下面的方式创建命令队列。

2025-04-19 20:51:50 1936 3

原创 Animated Raindrop Ripples In HLSL

这节课是利用材质做雨滴i效果首先是创建一个圆环,实际上他就是为了创建一个圆,但是是空心的,可以看之前我的做法,这里以他的为准。

2025-04-18 23:48:11 413

原创 Distortion, Animation & Raymarching

这节课的主要目的是对uv进行操作,实现一些动画的效果,实际就是采样的动画主要的变化公式,这里主要注意hlsl中因为是列优先存储所以右乘会更加的快速。这里列举了三种变化方式。

2025-04-16 23:51:51 270

原创 龙书第四章预备知识

思考一个问题,GPU只是去执行我们的程序,但是像是shader需要使用到的资源,gpu需要对资源进行读和写,所以在发出绘制命令之前,我们需要将本次绘制调用相关的资源绑定或者链接到渲染流水线上。例如一款支持级别11的GPU除了个别特例之外,必须支持完整的Direct3D11功能集,在创建device的时候,知道不同的级别能够使用的功能是非常重要的。多重采样技术是需要硬件支持的,direct3D中的硬件实际上就是我们抽象出来的device,这个后面再讲,它就可以当成是gpu硬件。

2025-04-13 17:38:48 658

原创 Raymarching Textures In Depth

课程代码产生深度的原因是uv偏移,黑色区域会不断向左偏移,直到找到白色区域,形成层级关系。下面为5次寻找时产生的效果。本节课最主要的就是学会hlsl中使用纹理采样。课程中的代码(没有这张图我就没做)

2025-04-12 23:21:52 376

原创 Raymarching A Donut & Deformation

在hlsl中定义function这样定义会报错,不允许单独的定义function把function写到一个struct中定义就可以了。

2025-04-12 20:25:22 251

原创 Introduction To Raymarching

在二维上我们画一个圆实际上就是定义一个pos 然后 周围的uv判断是否在圆内三维上我们画一个球,实际上就是三维的坐标到某个pos来判断是否在球内看一下作者的做法我们需要知道的是,这个球实际上还是我们在物体的表面上形成的视觉欺骗的效果,我们设置为平面并且设置为rayOrigin的颜色其实我还是不是很理解这个球怎么算的,我的感觉就是作者的做法是为了让它立体。

2025-04-12 12:19:21 268

原创 Animated Movement & Color

这节课主要的目的是额外输出的掌握本课首先延续上节课制作了一个旋转展开,旋转关闭的圆,并且变动了颜色首先定义了已遮罩模式,不为1的地方也就是黑色区域会透明掉。并且设定了额外输出注意到此时中间往外会越来越暗,这是因为中间的采样点离每个pos都很近,就叠加了亮度。

2025-04-10 23:44:42 399

原创 HLSL Complex Shapes With For Loops

制作一个动态的cycle的动画材质首先我们使用hlsl来写一个圆加入偏移让圆动起来。

2025-04-10 20:50:30 250

原创 introduceHLSL

最近打算好好学习一下ue的shader,跟着下面的视频,打算每天至少更新一集。通过下面的蓝图方式我们就可以得到一个变化的材质。custom节点允许直接的写入hlsl代码。alpha参数的生成实际上就是下面的式子。

2025-04-07 21:30:14 232

原创 directx的矩阵运算

我在生成cube的时候,发现directx的运算规则不一样,以此记录。正常的情况下我们计算最终的点是这是列向量模式的正常运算directx的运算是。

2025-02-25 16:58:34 149

原创 Directx上传堆和默认堆注意事项

之前我用directx写上传堆上传给默认堆Index,但是我发现数据无法被GPU读取。

2025-02-25 14:09:24 368

原创 Sampling Lights Directly

我们之前的采样方式都是在hitPoint的位置进行半球采样,这样做会有一个问题,如果我们这个点本来是被灯光照到的位置,但我们采样的过程中却并没有直射灯光的射线,会导致本来直射很亮的点却错误的着色。所以我们想到从灯光来进行采样。

2025-02-17 20:34:49 574

原创 正顺基碱基

之前的采样章节,开发了相对于z轴生成随机方向的方法,但是这个方法过于的片面,我们不能够保证所有的法线都与z轴对齐,我们需要考虑到不同的方向。

2025-02-17 13:03:24 656

原创 rayTrace 采样

这里的重要性采样是通过pdf的值来决定的。而SamplePDF的表示采样这个方向的radiance 的概率。文章中的意思我理解了一下,就是我们有两个采样的方向,一个是方位角一个是天顶角,不管是哪个的采样,其采样是独立的但是他们的概率都是1.于是我们需要在0到1的范围内进行采样.首先我们来看天顶角。我们计算到指定的r1的概率的CDF得到下面的推算(CDF就是到指定的角度的概率只和也就是一个概率密度的积分)但是我们的采样的方式并不是在交点处的半球内均匀的采样,而是依据normal来在一个球内采样。

2025-02-16 20:57:43 320

原创 RayTraceSeries分层采样

之前在像素上采样的方式为在每个像素额外的采样多次,然后计算一个期望,这就是MSAA的思想,这里的采样是随机的采样。这样可能会导致一个问题,我们知道采样非常的影响结果,如果采样的分布不均匀,就会导致结果的不正确。于是这里比较了分层采样和随机采样的结果的差别。最终的比较结果是分层采样的方式更加贴近真实的PI的值。比较的案例是利用一个单位圆来预估PI的大小。于是我们把它带入到射线的采样过程中。

2025-02-15 16:12:16 297

原创 计算环境光遮蔽的小技巧

其思想是,如果四周什么都没有,就是没有比你高的物体,那么你的遮蔽率就会很低。例如,当我们站在一个空旷的地方,周围没有高大的物体阻挡,各个方向的仰角都很小,那么环境光可以较为自由地照射到我们所处的位置;而如果我们处于一个狭窄的小巷中,两侧的墙壁会使某些方向的仰角增大,从而阻挡了部分光线,使得我们感受到的环境光强度降低。其主要思想是,我们一般去求AO的时候,需要再去对场景做一次正向渲染,然后根据着色点来进行遮蔽的采样,最终得到环境光的遮蔽比率。每次选择二维的一个方向,然后计算其最大的仰角。

2025-02-14 20:01:29 445

原创 Directx12 chapter4

接下来就是绑定到我们的描述符上,在绑定之前,我们需要知道它其实是首先得到描述符堆中的首描述符然后不断的向下位移得到描述符,也就是说我们需要获得堆描述符的首地址,然后还需要知道最终能够位移多少个描述符防止过载,同时还可以拿到别的类型的描述符的数量。根据交换链中的缓冲区的数量创建了缓冲区的资源数量,接下来我们需要将缓冲区绑定到描述符中,其实描述符的堆类型有两种,一种是gpu不可见,一种是gpu可见。我们可以在不同的阶段,为资源创建不同的描述符,这样资源就可以有不同的用处。

2025-01-07 20:40:06 1127

原创 Vulkan的基本流程(持续更新)

本文章只涉及创建的流程,用来自己梳理,可以用来参考,具体的原理请参考。

2024-12-26 15:07:41 1236

原创 Opengl SSAO

可以思考一个问题,ssao是将无限远的地方当作间接光照,那么当你的深度和我的shader point深度差值太大,我就不应该考虑你对我的影响,而如果你离我很近遮挡我,证明我的反射光照无法传递出去,那么影响就大。这里我思考了一下,是这样的,为什么需要转为view空间呢,因为ssao的本质就是测试到camera的深度,如果采样点的深度浅则看得见。造成这种现象的原因是,当处理该片段的时候,该片段的gposition落到后面的背景上,那么采样的深度很大部分在人体上,导致可见度很低。

2024-12-06 13:43:35 973

原创 opengl bloom 泛光

泛光效果无泛光lhjackgod。

2024-11-29 12:21:11 1210

原创 Games202作业5(完结)

也就是我们需要在像素(i,j)的四周进行采样,然后将采样的权重加到一起,然后所有的权重和像素的乘积也加到一起,然后相除,得到最终滤波后的(i,j)像素期望的结果。首先我们需要求出motion vector来判断上一帧的像素位置来补充当前帧的对应像素的信息。所有作业代码(作业2被我弄不见了....)其实就是膨胀卷积原理,间隔采样。也就是针对图像空间进行降噪。首先我们需要计算均值和方差。

2024-10-20 16:55:33 387 1

原创 Games202作业4

这部分就是利用蒙特卡洛积分求微表面材质,也就是说此时假定,光照的大小为1.0,同时近似认为菲涅尔项为1.0。这里实现ImportanceSampleGGX是使用LearnOpengl中的公式,好吧,还是得学完。所谓重要性采样,文档中的意思就是计算m(半程向量)的值后,再利用这个值去求解L。可以看到在粗糙度较低时,我们计算出的积分值非常小并且有很多噪声。可以很明显的看出diffuse的材质上,上一行的表现要优于下一行。是因为低粗糙度的微表面材质接近镜面反射材质,即微表面的法线。附近,而我们由采样入射光方向。

2024-10-19 17:47:51 488

原创 GAMES202作业3

实现SSR的找交点的算法,通过倍增的方式快速找到交点,但是这里我感觉如果和课上的内容一样,应该还有一步存储一个step中最浅高度的做法,这里我没写这一步,偷懒了。,然后组成TBN矩阵把这个局部向量转换成世界坐标下的方向向量,也就是我们世界空间下的步进方向。采样20次后,可以看到一个不错的color bleeding现象。我们需要使用作业框架提供的函数。可以检验直接光照是否正确。

2024-10-09 19:26:27 731

原创 GAMES202作业2

确定查询方向:你需要一个三维方向向量,通常是通过法线、反射向量或视线方向等计算出来的。这是着色点的“查询方向”,用于在 cubemap 中查找光照。这个方向向量 ((x, y, z)) 指向环境中的某个方向。我们要找到与这个方向对应的 cubemap 面和该面上具体的二维坐标。找到对应的Cubemap面根据这个方向向量 ((x, y, z)) 的符号和大小,可以判断这个方向向量是指向 cubemap 的哪个面。例如:如果 (x) 分量最大且为正,说明该方向指向 cubemap 的 +X 面(右侧)

2024-10-08 11:42:58 1183

原创 贝尔曼公式

从一个状态和action出发得到的average return。这里得到s1的state value的值为8.5,这个policy是没有上一个policy好的。在选择哪个策略更好的时候,此时需要使用到return,比如下面三个策略的返回值。这里的v,r向量化都很明显,这里的P,实际上是利用举证的乘法,对于其中的。就是每一行的值和其列向量相乘得到不同的i对应不同的j的和。action value和state value的关系。上图定义了不同的起点下的return value。趋向无穷的时候,这个。

2024-10-06 14:55:07 930

原创 强化学习——基本概念

例如上图就是location,就是网格的位置为state就是可采取的行动,这里就是可以move的位置就是状态采取action后的state当这个数是正数,代表这个行为是鼓励的,如果是负数,代表为惩罚,这个行为不鼓励。(这个正负数是相对的,就是数学概念,比如也可以用正数代表惩罚)包含了状态,action, reward。每个trajectory需要有return如上图,每次进入到target都会得一分,然后分数就会无穷大了每一个reward都设置一个,此时这个无穷值就变成了一个数,并且,如果。

2024-10-05 20:55:14 382

原创 GAMES202 作业1

我们首先需要知道一件事情,就是在UV坐标中,坐标的范围为0到1,所以我们设定一个滤波框的大小,并且想象我们将shadow map除以其本身的大小,shadow map就变成了1的单位大小。那么我们的处理方式就是设定采样窗口和采样密度,然后再窗口内均匀的采样,再shadow map上如果采样点的深度小于当前的深度,那么认为是遮挡物,记录其平均的深度信息。其中参数c是我们可以调节的一个最终系数,而参数filterRadiusUV是当使用PCF时,自适应还得考虑PCF的采样范围,但我们实现目前暂时用不到。

2024-09-20 13:46:08 972

空空如也

空空如也

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

TA关注的人

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