- 博客(22)
- 收藏
- 关注
原创 PBR中引入IBL——镜面反射篇
文章目录PBR中引入IBL——镜面反射篇回顾上一篇:漫反射镜面反射的计算思路镜面反射部分方程的分解生成预计算纹理必要的预备知识镜面波瓣蒙特卡洛积分(Monte Carlo Integration)重要性采样低差异序列(Low Discrepancy Sequence)预滤波环境贴图prefilterMap生成prefilterMap的mipmap贴图计算积分实现低差异序列实现重要性采样prefilterMap的着色器BRDF积分贴图brdfLUT整理积分方程brdfLUT着色器完成IBL的镜面反射完成IBL
2021-09-30 11:07:38 555
原创 PBR中引入IBL——漫反射篇
文章目录PBR中引入IBL——漫反射篇IBL分解渲染方程irradiance map的生成和作用irradiance map生成过程环境纹理envTexture的格式环境纹理envTexture的类型计算irradiance map计算间接光照中的漫反射效果对比PBR中引入IBL——漫反射篇IBLIBL(Image based lighting,基于图像的光照)是一类光照技术的集合在IBL中,将周围环境整体视为一个大光源IBL通常使用环境立方体贴图实现,可以理解为:将立方体贴图的采样值认为是渲染
2021-09-15 14:28:46 461
原创 PBR中直接光照的实现
文章目录PBR中直接光照的实现重点回顾直接光照实现直接光照Irradiance部分radiant intensity为什么用颜色值表示?BRDF部分k_d、k_sDFGBRDF剩余的项合并不能忽视的地方加上环境光HDR渲染Gamma校正PBR中直接光照的实现重点回顾Radiant Flux:光源单位时间所输出的能量,符号Φ,ϕ=dQdt\phi = \frac{dQ}{dt}ϕ=dtdQ,单位瓦特(W)Radiant Intensity:光源单位立体角发出的能量, 符号I,I(ω)=dϕd
2021-09-11 15:52:08 301
原创 PBR中BRDF的实现
文章目录PBR中BRDF的实现白说辐射度量学(Radiometry)Radiant fluxRadiant Intensity立体角(Solid Angle)圆心角IrradianceRadiance对比Irradiance与Radiance引入BRDF引入反射方程实现BRDF漫反射部分镜面反射部分正态分布函数(Normal Distribution Function)菲涅尔方程(Fresnel Rquation)几何函数(Geometry Function)Cook-Torrance反射方程参数的输入各种
2021-09-04 15:33:57 735
原创 SSAO
文章目录SSAO引入SSAO原理带有深度值的贴图确定遮蔽因子实现渲染需要的纹理统计遮蔽因子,生成ssao纹理定义半球采样核心采样点数量性能问题噪声图像利用四幅纹理,计算光照效果对比SSAO引入SSAO要想渲染出逼真的效果,模拟真实世界的光照必不可少,这种光照模型有两部分组成:直接光照和间接光照,他有个高大上的名字,全局光照全局光照虽然可以渲染出逼真的效果,但开销巨大,不适合应用到实时渲染在实时渲染中,为了效率和效果达到一种平衡,只能将光照模型简化、变形甚至省略之前,提到的Blinn-Phong
2021-08-20 23:16:42 245
原创 延迟渲染
文章目录延迟渲染引入延迟渲染引入GBuffer两个阶段几何着色阶段延迟光照处理阶段副作用不能混合不能MSAA?对比正向渲染延迟渲染引入延迟渲染如果已经学习了一段时间的渲染,但还不知道什么是延迟渲染,那么之前用的渲染方式很有可能就是正向渲染(Forward Rendering)之所以没有明确的提出正向渲染这个概念,可能是因为场景渲染情况比较简单,渲染过程没有用到很特殊的技巧,就是一套按部就班组成的顺理成章,所以没有必要再提出一个新的概念但是,当场景变的复杂时,比如有一堆光源和物体,每个光源和每个物
2021-08-11 23:33:17 561
原创 泛光
文章目录泛光摊牌实现过程关键步骤多渲染目标(MRT)高斯模糊片段着色器客户端程序混合泛光摊牌表现光源的一种特效使光源的颜色向周围发散也叫做光晕实现过程将场景渲染到指定的帧缓冲,并从中提取出光源的部分将光源的部分进行模糊操作将模糊后的光源与第一次场景渲染的结果混合,得到最终的结果需要注意的是:因为要提取光源的部分,为了这一步好处理,我们利用之前提到的HDR,将光源的颜色设置为大于1.0的值,其他物体的颜色都是正常的小于1.0的值;因此使用HDR的原因是为了方便提取光源从上面的步骤看
2021-07-29 20:11:35 378
原创 HDR(High Dynamic Range, 高动态范围)
文章目录HDR(High Dynamic Range, 高动态范围)引入HDR引入浮点帧缓冲创建浮点帧缓冲引入色调映射色调映射Reinhard色调映射曝光(Exposure)色调映射自动曝光调整(Automatic Exposure Adjustment)或者叫人眼适应(Eye Adaptation)技术HDR作用HDR(High Dynamic Range, 高动态范围)引入HDR你可能遇到过这种情况:当场景中大部分片段的颜色值超过1.0时,就会使渲染效果混成一片,难以分辨。这是因为:显示器被限制
2021-07-22 15:59:13 792
原创 法线贴图
文章目录法线贴图引入法线贴图法线贴图引入切线空间切线空间计算TBN矩阵使用法线贴图方法一方法二两种方法比较使用法线贴图与不使用的对比法线贴图引入法线贴图对于是一个平面的物体,比如一块桌面或者一块地砖的表面,只使用纹理就可以表现出很好的效果;但对于凹凸不平的物体表面,比如由很多砖块砌成的墙面,只使用纹理就不能表现出凹凸不平的细节,原因是:在片段着色器中计算光照时,每个片段使用的法线是插值的顶点法线,而这些法线几乎相同,所以表现不出凹凸不平的视觉如果我们能通过一种方式获取物体表面不同的朝向,再根据不同
2021-07-21 18:49:56 572 1
原创 级联阴影贴图(CSM)
文章目录级联阴影贴图(CSM)摊牌原理摄像机空间中视锥体分段光源空间中正交投影算法一实现级联阴影贴图(CSM)摊牌级联阴影贴图,如果按照OpegnGl的尿性给他起个别名,我大概率会给他Mutil shadow mapping(多重阴影贴图),这样他的意思就更显而易见了——使用多张阴影贴图实现阴影的一种技术在阴影贴图那一篇中说,升级阴影贴图的算法就可以实现CSM,那么为什么要升级?怎么升级?阴影贴图的缺点:阴影边缘的锯齿严重。原因是阴影贴图的分辨率低,在对阴影贴图采样时,多个不同的顶点对同一个像素
2021-07-10 15:12:58 892
原创 点光源阴影
文章目录点光源阴影(Omnidirectional Shadow Maps)摊牌原理实现显示立方体深度贴图副作用锯齿点光源阴影(Omnidirectional Shadow Maps)摊牌由点光源产生的阴影,过去的名字是万向阴影贴图(Omnidirectional Shadow Maps)点光源可以照射的方向是空间中的各个方向,因此他产生的阴影也是在空间中的各个方向原理先回顾一下阴影贴图中提到的绘制阴影的原理:首先在光源的视角下渲染场景,得到一张深度贴图,然后在摄像机的视角下再次渲染场景,
2021-06-23 22:16:39 536
原创 阴影贴图
文章目录阴影贴图摊牌思路原理实现副作用阴影失真悬浮采样过多1采样过多2锯齿阴影贴图摊牌在游戏中实现实时阴影时,阴影贴图是使用较多的一种技术,用这种方式实现的阴影,效果不错、相对容易实现、性能也不会太低,而且很 容易扩展到更高级的算法,比如点光源阴影和CSM思路当以光源的位置为视角进行渲染,能看到的东西都将被照亮,看不到的一定是在阴影中原理第一步以光源的位置为视角,进行视图和投影变换,渲染场景,这一步的主要目的是把深度值存储到纹理中,这样的纹理就叫做深度贴图或者阴影贴图,这个技术的名
2021-06-15 22:36:08 237
原创 Gamma校正
文章目录Gamma校正Gamma值为什么需要Gamma校正?什么时候需要Gamma校正?sRGB颜色空间怎么使用Gamma校正?使用OpenGL内建的sRGB帧缓冲自己实现Gamma校正sRGB纹理光的衰减Gamma校正Gamma值每种显示设备都有自己的Gamma值,且各不相同,但都遵循:设备输出亮度=输入电压的Gamma次方阴极射线管显示器(CRT):显示出来的亮度是输入电压的2.2次方,因此CRT的Gamma值就是2.2我们可以通俗的来理解Gamma值:显示器显示出来的颜色是原来颜色的Gam
2021-06-07 22:05:11 547
原创 Blinn-Phong光照模型
文章目录Blinn-Phong光照模型摊牌组成环境光照漫反射光照镜面光照实现环境光照漫反射光照镜面光照神仙打架Blinn-Phong光照模型摊牌自然界中的光照很复杂,在计算机上实现起来更复杂,Blinn-Phong光照模型是在Phong光照模型的基础上做了一些改动,同时具备了实现简单、效果真实两个优点,所以被广泛应用组成Blinn-Phong光照模型有环境光照、漫反射光照和镜面光照三部分组成环境光照在绝大部分情况下,总是会有像太阳、月亮或者其他远处的光源存在,所以物体几乎不会出现完全
2021-06-02 22:35:35 310
原创 实例化
文章目录实例化诞生使用实例化数组一个栗子(实例化数组)实例化诞生如果要对同一物体渲染很多次,每次只是在世界坐标中的位置不一样,要是使用常规的绘制接口glDrawArrays或glDrawElements,那么当绘制的数量达到一定的程度后,就会出现卡帧卡帧的原因:OpenGL在绘制顶点数据之前,需要做很多的准备工作,比如告诉GPU该从哪个缓冲的哪个位置读数据,而且这些过程都是在CPU到GPU的总线上进行的,效率比较低,所以我们常说GPU渲染顶点很快,但命令GPU去渲染不一定快解决办法:将数据一次性
2021-06-01 21:27:40 119
原创 抗锯齿
文章目录抗锯齿为什么会有锯齿?怎么抗锯齿?多重采样(Multisample Anti-aliasing, MSAA)实现多重采样OpenGL中的多重采样离屏渲染实现多重采样创建多重采样缓冲使用多重采样缓冲抗锯齿为什么会有锯齿?在渲染图形时,当渲染管线将图元的各顶点转化为片段时,由于顶点到片段的映射方式简短粗暴,使图元的边缘看起来格外辣眼,我们把这种现象叫做锯齿或者走样怎么抗锯齿?从产生锯齿的原因可知,如果从顶点到片段的映射方式高级一些,对图元边缘处的片段颜色弱化一些,让边缘看起来圆润一些,就
2021-06-01 21:24:27 158
原创 几何着色器
文章目录几何着色器什么是几何着色器?为什么要用几何着色器?怎么使用几何着色器?一个栗子银角大王的小葫芦:”收“几何着色器什么是几何着色器?几何着色器是顶点着色器与片段着色器之间的一种可选着色器,他的输入是一个图元的一组顶点,输出是另一个图元的一组顶点为什么要用几何着色器?由于几何着色器可以在顶点发送到下一着色阶段之前对他们随意变换,所以他的作用就是将一个图元变换为另一个完全不同的图元,或者修改图元的位置怎么使用几何着色器?在几何着色器的顶部,声明从顶点着色器输入的图元类型:layou
2021-05-28 21:23:45 266
原创 立方体贴图
文章目录立方体贴图什么是立方体贴图?为什么要用立方体贴图?怎么使用立方体贴图?天空盒客户端的绘制顶点着色器片段着色器改进天空盒绘制方式先说一下提前深度测试改进思路顶点着色器客户端的绘制环境映射反射片段着色器顶点着色器折射立方体贴图什么是立方体贴图?立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体贴图的一个面特性:只要立方体贴图的中心位于原点,我们就能使用立方体的实际位置向量做为纹理坐标对立方体贴图进行采样为什么要用立方体贴图?用立方体贴图可以实现环境贴图怎么使用立
2021-05-25 22:19:45 335
原创 帧缓冲
文章目录帧缓冲什么是帧缓冲?为什么需要帧缓冲?帧缓冲的作用怎么使用帧缓冲?一个完整帧缓冲要满足的条件附件纹理附件渲染缓冲对象(rbo)两种附件的选择创建帧缓冲控制函数一些例子渲染到纹理添加简单的后期处理反相灰度核效果模糊边缘检测帧缓冲什么是帧缓冲?简单的说,把颜色缓冲、深度缓冲和模板缓冲结合起来就是帧缓冲;帧缓冲被存储在内存中OpenGL允许自定义帧缓冲,即自定义帧缓冲中的颜色缓冲、深度缓冲和模板缓冲为什么需要帧缓冲?利用帧缓冲可以做出炫酷的后期处理效果这个“后期处理”是很值得细品的,稍
2021-05-21 00:00:29 755
原创 混合
文章目录混合什么是混合?为什么需要混合?怎么实现混合?透明度的表示加载、创建透明纹理控制函数警惕深度测试与混合一起使用解决办法透过红色窗户看木箱的例子混合什么是混合?在图形接口中,这里指OpenGL,混合是实现透明的一种技术,实现了可以透过前面透明或半透明物体看到后面物体的效果混合在“微观”层面指的是:对当前片段在片段着色器输出的颜色与颜色缓冲中的颜色进行某种操作后,得到的颜色因此,混合在光栅化中的位置是:在片段着色器运行之后,并且在所有的测试都通过之后,再进行混合操作为什么需要混合?当
2021-05-17 22:35:03 96
原创 模板测试
文章目录模板测试为什么要用模板测试?什么是模板测试?怎么使用模板测试?模板缓冲模板测试在光栅化中的位置控制函数使用流程使用模板缓冲实现物体轮廓的效果对轮廓进行发光处理木箱最初的效果模板测试为什么要用模板测试?顾名思义,就是以场景中某个物体为模板进行绘制这个模板是屏幕空间中的模板,是一个二维模板,所以绘制出来的效果也是二维的什么是模板测试?用片段指定的参考值与模板缓冲中的模板值进行比较,如果达到预设的比较结果,模板测试就通过了,然后用这个参考值更新模板缓冲中的模板值;如果没有达到预设的比较结
2021-05-15 00:35:18 133
原创 深度测试
文章目录深度测试为什么需要深度测试?什么是深度测试?怎么进行深度测试?深度缓冲深度测试在光栅化中的位置控制函数深度值的大小深度图像副作用深度测试为什么需要深度测试?为了实现场景中物体的遮挡效果如果没有深度测试,场景前边的物体不会挡住后边的物体;同一个物体前边的部分也不会挡住后边的部分,会使物体出现显示不全、闪烁等一些不好的现象什么是深度测试?当前片段的深度值与深度缓冲中的深度值比较,如果符合预设的比较结果,就认为测试通过,然后用当前片段的深度值替换深度缓冲中的深度值;如果测试不通过,就丢弃
2021-05-10 22:20:22 622
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人