GPU Gems1 - 2 水刻蚀的渲染

2.1 引言

光线从弯曲的表面反射或折射,因此只聚焦在受光面上的某些区域,于是就产生了刻蚀现象。本文从美学角度出发,不以纯物理的方式计算,使其很容易在大多数图形硬件上实现,效果又十分逼真。

2.2 刻蚀的计算

如果想正确地计算水下的刻蚀,是一个复杂的过程:这涉及到数目庞大的光线及其相互作用。为了模拟这一过程,必须从光源射出光子作为开始,一部分光子碰到海面,或者反射或者折射。对于折射部分,按照Snell折射定律:

用该公式编程很不容易,可以将公式变形为一个更容易编程的形式,例如Foley等人1996年提出的:

光子一旦入水后,即发生折射并继续前进,随着入水的深度增加光强度会衰减,最后一些光子会碰到海底并将其照亮。由于海面的波纹,经过不同路径入水的光线,可能最终照到海底相同的区域,每当这个现象发生时,在刻蚀中的聚集光线就会形成明亮的光斑,类似于透镜的聚光现象。

刻蚀其实可以通过正向或逆向光线跟踪计算。在正向光线跟踪中,要跟踪从光源射出并穿过场景的光线,累计其在不连续地区的贡献。逆向光线跟踪,则以相反的过程工作。它从海底开始,按照与入射光线相反的顺序逆向跟踪光线,计算给定点的所有入射光线综合。但是无论是正向光线跟踪计算,还是逆向跟踪计算,都非常费时,因为只有极小部分的计算对最终结果有实际意义。

2.3 方法

本文采用的方法,是逆向光线跟踪的一个简化。我们只计算到达海底光线的一个子集,该子集就是只计算垂直与地面的光线,因为那些从入水到碰上海底面,传播距离最短的光线,才会最容易形成刻蚀。这种方法计算消耗非常少,尽管物理上不“”正确“”但是非常逼真。

我们的算法如下。从海底开始,绘制海底地面后,使用第二次混合叠加渲染来渲染刻蚀。为了这样做,我们创建一个与水网格尺寸相同的海底网格,并且用刻蚀值对其逐顶点地着色。为了创建光照,采用逆向光线跟踪:从海底网格的每个顶点,垂直地向上发射光线,一直到达正好位于哪个顶点之上的水波点。然后,使用有线差分计算那个点的海面波的法线。有了矢量和法线,使用Sneel公式,创建出从水波射向空气的第二级光线。我们再计算每条光线和垂直线的夹角,愈靠近垂直的方向,那个方向进入大海的光线就越多。

2.4 使用OpenGL实现

使用两个pass,第一次渲染使用一个普通纹理渲染还地面。然后第二个pass通过刻蚀算法,逐一照亮海底网格的顶点。

2.5 使用高级着色语言实现

先前OpenGL实现中,是在CPU上执行的波函数。现在可以采用逐像素法代替逐顶点法,全面的提高了视觉质量。

关于法线的计算,不像前面提到的使用有线差分方法,我们考虑了两种方法,他们都使用波函数的偏导产生法线:

1.在屏幕空间可以渲染过程纹理,当只有小部分像素看的见时,这个方法可以节省渲染时间,但是也意味着当有很多像素看得见时,对每个像素都要做同样多的工作,这些大量的工作显然要减小帧率。

2.在纹理空间中渲染一个分辨率固定的渲染目标贴图,在纹理空间中渲染,能够固定每帧的工作量,这是一个优越性,但是却丢掉了一个好处,不能只渲染看的见的像素了。另外,也很难决定使用多大分辨率对当前场景合适。

我们可以进一步优化运算,一是使用Snell定律对入射光线的折射,二是简单的基于从水面到水底的距离,沿着波法线进行的环境映射。结果,穿过纹理中心的垂直光线是明亮的,而夹角光线则逐渐衰弱。而且,深度越大,环境反射贴图的相对尺寸越小,因为刻蚀会随距离而衰减,所以产生的刻蚀也约细。

核心点总结

  • 简化的反向光线追踪
  • 光照环境贴图映射

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

邮箱服务器ip地址白名单,申请SSL证书时如何设置IP地址白名单和邮箱白名单

8月3日消息 在申请SSL证书时,由于您的邮箱可能默认设置或自定义设置了拦截国外邮件,可能会导致您接收不到CA的邮件,给验证、收取证书带来了不便;如果服务器,防火墙也设置了拦截操作,那么即使您按CA要求完成…

求生2本地服务器怎么修改参数,《求生之路2》服务器指令及难度参数设置(难度篇)...

本文整理的都是一些有关难度的服务器参数命令,许多插件都会用到这些相关的指令实现一些功能,比如是购物插件中技能的实现,彩色坦克插件掉宝配置的实现等.安装了插件这些指令可以直接使用,可以根据自己对于难度的需要作一些调整,关于作弊.榴弹炮参数的一些指令,没有收录.服务器命…

GPU Gems1 - 3 Dawn Demo中的皮肤渲染(Skin in the Dawn Demo)

该篇文章参照浅墨的这篇文章:https://zhuanlan.zhihu.com/p/35974789 Dawn是由NVIDIA创建的,用来介绍GeForce FX产品线的演示程序,它说明如何使用可编程的着色技术创建出逼真的人类角色。 最初的Dawn Demo由NVIDIA于2002年发布,…

jest测试ajax,ajax – 如何使用Jest来测试React呈现的异步数据?

我正在使用React for render和Jest / Jasmine进行测试.我使用旧的Jest / Jasmine等待测试并运行,但现在这些已经在Jasmine 2中消失了,我不知道如何用新的asyncs替换.在我的代码中,React呈现了一个关于用户的小页面.该页面有一个AJAX调用来获取用户帖子.我想测试一下用户的帖子回…

GPU Gems1 - 5 改良的Perlin噪声的实现

Perlin 噪声 KenPerlin(1985a,2002)KenPerlin(1985a,2002) 定义的噪声函数是最常用的噪声函数,称为 Perlin 噪声。PerlinPerlin 噪声在全部 (x,y,z)(x,y,z) 整形顶点处的参数值都为 00,变化源自各顶点间的梯度向量,然后再进行平滑插值。 计算…

GPU Gems1 - 7 无数波动草叶的渲染

本文部分参照该文章https://zhuanlan.zhihu.com/p/35974789 1.引言 本章介绍了一种灵活的,广泛应用的草模拟。该方案渲染的草不仅生长得自然,也能够逼真地在风中舞动,而且性能很高。 2.概述 首先,需要意识到,对单个…

2003文件服务器迁移2016,服务器2016设置文件共享

服务器2016设置文件共享 内容精选换一换为了保证使用生成的镜像创建的新云服务器可以实现一键式重置密码功能,建议您安装密码重置插件CloudResetPwdAgent,可以应用一键式重置密码功能,给云服务器设置新密码。下载一键式重置密码插件CloudRese…

GPU Gems1 - 8 衍射的模拟

1.什么是衍射 小尺度的表面细节引起反射波彼此干扰,这个现象就是衍射。首先,计算机绘图的大多数表面反射模型都忽略自然光的波动效果。当表面的细节比光的波长(约1um)大许多时,不存在问题。但对于小尺寸的细节&#x…

GPU Gems1 - 9 有效的阴影体渲染

这章全面讲述了用于实时阴影渲染中常见两种流派之一的阴影体(Shadow Volumes)技术,又称模板阴影(Stencil Shadows)技术,重点是得到正确的角度的情形,减少几何图形和填充率的消耗。 简单谈谈阴影…

GPU Gems1 - 10 电影级的光照

本章中介绍了一个的简化的uberlight(可理解为“全能光照”)实现,此光照shader根据Ronen Barzel(1997,1999)提出的照明模型编写而成。而该模型的超集已由Pixar动画开发,并应用于《玩具总动员》、《怪物公司》、《海底总动员》等一系…

GPU Gems1 - 11 阴影贴图反走样

这章介绍了如何通过邻近百分比过滤方法(Percentage-Closer Filtering , PCF)有效减少阴影贴图的反走样,并描述了如何实现一个简化版本,并对PCF方法进行了一定改进。关于阴影贴图和PCF技术的一些链接 https://pubweb.eng.utah.edu…

GPU Gems1 - 12 全方位的阴影映射

在这章中,把阴影贴图的思路扩展到正确处理全方位的(点)光源中,其中包括了实现细节,也涉及到基本硬件能力不足时的低效运行策略。 首先,这篇文章也谈到了在实时计算机图形学中产生可见阴影的两个流行方法是…

GPU Gems1 - 13 使用遮挡区间映射产生模糊的阴影(Generating Soft Shadows Using Occlusion Interval Maps)

这章介绍了一种渲染软阴影的技术,称为遮挡区间映射(Occlusion Interval Maps),能够正确地在静态场景中渲染出光源沿着预定路径移动时产生的模糊阴影。之所以叫遮挡区间映射,是因为此算法使用纹理贴图来存储这种光源可见…

粗糙表面的微表面模型——Physically Based Material

关于文章 Microfacet Models for Refraction through Rough Sufaces的一点笔记,欢迎指正。 BSDF BSDF(Bidirectional Sacttering Distribution Function) 描述了光如何在物体表面散射。如果仅仅限制反射或者透射,BSDF经常被称作BRDF或者BTDF,然而BSDF将…

GPU Gems1 - 14 透视阴影贴图(Perspective Shadow Maps: Care and Feeding)

开篇先说,这文章好难懂啊,到现在也没完全弄明白,有大佬的话欢迎指点。这篇大体意思是对Perspective Shadow Maps进行部分优化。GEMS这书这点是真挺蛋疼,很多文章都是对某项技术的优化,那先介绍介绍原来技术嘛&#xff…

C++——lambda表达式

介绍 lambda表达式是一种局部类类型&#xff0c;它含有一个构造函数&#xff0c;和一个const成员函数operator()()。 lambda表达式除了能做参数外&#xff0c;还能用于初始化一个声明为auto或者std::function<R(LA)>的变量。R是lambda的返回类型&#xff0c;LA是它的类…

GPU Gems1 - 15 逐像素光照的可见性管理

这章讲到了可见性在逐像素渲染光照场景中的作用&#xff0c;也考虑如何使用可见性减少必须渲染的批次数量&#xff0c;从而改善性能。 假设一个非常简单的场景&#xff0c;一个房间&#xff0c;因为房间的不同部位是不同的材质&#xff0c;所以将其分为8个batch&#xff0c;另…

重建世界坐标

1.概论 在屏幕空间做一些操作的时候往往需要从屏幕坐标和深度纹理中重建出相应的世界坐标。 本文会讨论两种重建世界坐标的方法&#xff0c;并详细讲解第二种方法。 使用VP逆矩阵CameraPosInWorld linearDepth * Direction 2.使用VP逆矩阵法 我们知道屏幕坐标是通过Object…

GPU Gems1 - 16 次表面散射的实时近似(Real-Time Approximations to Subsurface Scattering)

这一章&#xff0c;浅墨这篇文章介绍的非常详细&#xff0c;我照扒一遍再稍加一些内容&#xff0c;增加记忆。https://zhuanlan.zhihu.com/p/36499291 【章节概览】 次表面散射&#xff08;Subsurface Scattering&#xff09;&#xff0c;简称SSS&#xff0c;或3S&#xff0c…

Unity HDRP渲染管线基础指南

HDRP和LWRP简介 Unity2018中引入了可编程渲染管线&#xff08;Scriptable Render Pipeline&#xff0c;简称SRP&#xff09;&#xff0c;是一种在Unity中通过C#脚本配置和执行渲染的方式。至2018.1版本&#xff0c;Unity中除了默认渲染管线&#xff0c;还提供了轻量级渲染管线…