文章目录

  • 前言
  • 一、简介
  • 二、数学物理依据
  • 三、理论方法
  • 五、实际方法
    • 1、OPENGL
    • 2、HLSL
  • 总结

前言

第二篇,我看了下比上一篇短一点
b( ̄▽ ̄)d 直接正题罢。


一、简介


焦散是指当光线穿过一个透明物体时,由于对象表面的不平整,使得光线折射并没有平行发生,出现漫折射,投影表面出现光子分散。

焦散是由从曲面反射或折射的光线产生的,因此仅聚焦在接收表面的某些区域。

本章的目的是展示一种用于渲染实时焦散的新技术,从物理基础到实现细节描述该方法。以美学体验为导向,不刻意遵守真实的物体细节。

二、数学物理依据

计算水下焦散是一个复杂的过程,涉及数以百万计的单个光子,并发生许多相互作用。


在折射下会有:

假设入射、透射和表面法线是共面的:

在折射之后,光子随着深入,有一些会减弱,但有一些会打到海底。海浪形成的各种透镜会造成聚集光的效果。

从模拟的角度来看,焦散通常通过正向或反向光线追踪来计算。

有两种实现光线追踪的方法:

  • 前向光线追踪,计算从光源打出来的
  • 后向光线追踪,试图计算给定点的所有入射光的总和,理想情况下,这将通过求解来自被照亮点上方的所有光的半球积分来实现(可以看games101)。原理大概是,从被打中的点出发,向外发送射线,只有那些实际上最终击中光源的光线才对焦散有贡献,其余的光线只是作为错误假设而被丢弃。
  • 但是我们两种方法都没有用:只有一小部分计算时间有助于最终结果。在商用焦散处理器中,有用光线与总光线的比率通常在 1% 到 5% 之间。
  • 我们的方案:光线从太阳追踪到波浪网格中的每个顶点。这些光线使用斯涅尔定律折射,因此产生了新的光线。

三、理论方法

我们用来模拟水下焦散的算法只是上一节中解释的反向蒙特卡洛光线追踪思想的简化。

我们只计算到达光源的一个子集。因此,该方法具有非常低的计算成本。

这是子集的筛选条件:

  • 我们假设我们在中午计算赤道上的焦散。这意味着太阳就在我们的正上方。

    太阳距离地球的距离在 147 到 1.52 亿公里之间,具体取决于一年中的不同时间,它的直径为 142 万公里,太阳光照射的夹角为 0.53 度。
  • 海底被感照射点上方垂直发出的光线照亮。水的透明度在每延米 77% 到 80% 之间,因此每米有 20% 到 23% 的入射光被介质吸收,用于加热。
  • 从逻辑上讲,这意味着当光线从进入水中到到达海底的那一刻传播最短距离时,形成焦散最清晰。因此,焦散对于垂直光线而言将是最大的,并且对于侧向进入水中的光线而言将不那么可见。

  • 我们从制作完成地平面之后开始。使用第二个加法混合通道在其上渲染焦散。为此,我们创建了一个与波浪网格具有相同粒度的网格,并将使用焦散值按顶点着色:0 表示无光照;1 表示一束非常聚焦的光击中海底。为了构建这种照明,使用了反向光线追踪:对于我们网格的每个顶点,我们将其垂直投影,直到到达位于其正上方的顶点。然后,我们使用有限差分计算波在该点的法线。使用矢量和法线,并使用 Snell 定律(水的折射率为 1.33),我们可以创建从波传播到空气中的次级射线。这些射线是为海底带来照明的潜在候选者。为了测试它们,我们计算了每一个与垂直线之间的角度。因为太阳距离很远,我们可以简单地用这个角度来衡量照度:越接近垂直方向,从那个方向射入海洋的光就越多

五、实际方法

1、OPENGL

伪代码:
1、画海底。
2、对于网格中的每个顶点:

  • 发送垂直射线。
  • 将射线与海洋表面的网格碰撞。
  • 逆向使用斯涅尔定律计算折射光线。
  • 使用折射光线计算“太阳”贴图的纹理坐标。
  • 将纹理坐标应用于更精细网格中的顶点。

3、渲染海洋表面。

2、HLSL

(我今天才知道HLSL是高级渲染语言的简称)

计算每个像素而不是每个顶点的焦散可以提高整体视觉质量,并将效果与几何复杂性解耦。

有两种方法把这个过程从顶点着色器转换到像素着色器上,两种都使用波函数的偏导数来生成法线

  • 第一种方法利用程序纹理可以在屏幕空间中渲染这一事实,从而在只有一小部分像素可见时节省渲染时间。但是可见的像素多了,效率就低了
  • 第二种方法是在纹理空间中渲染到固定分辨率的渲染目标。尽管在纹理空间中渲染具有在每一帧保持恒定工作负载的优势,但仅渲染可见像素的好处就失去了。此外,很难衡量哪种渲染目标分辨率最适合当前场景。

该效果计算了波函数的法线,以追踪射线的路径到平面上的截点——在本例中为海底。为了生成法线,可以很容易地找到波函数在x和y中的偏导数。请注意,这种方法允许我们拥有一个不平的海底面,并且这个可变深度可以很容易地编码为顶点属性的标量分量。

波函数:

其中i表示用于生成波的阶数(翻译为八音度?这个英语我没太懂);c 1、c 2和c 3是常数,分别给出波的频率、幅度和速度;x和y的取值范围为 0 到 1(含),合起来表示单位正方形上的一个点。

得到偏导数:


偏导数实际上是切线在计算点的分量。因为该函数实际上表示高度或z ,所以关于z的偏导数只是 1。法线是切线向量的叉积,

渲染焦散线所需的最后一个方程是线到平面的截距。我们可以使用以下方法计算从一条线上的一点到平面上的交点的距离:


代码:

 float4 main(VS_OUTPUT vert,              uniform     sampler2D LightMap : register(s0) ,              uniform     sampler2D GroundMap : register(s1) ,              uniform     float Timer) : COLOR {    // 从波函数的梯度生成法线(线方向)和     与水平面拦截。     // 我们使用屏幕空间 z 来衰减效果以避免混叠。     float2 dxdy = gradwave(vert.Position.x, vert.Position.y, Timer); float3截距 = line_plane_intercept(vert.Position.xyz,                        float3 (dxdy,饱和(vert.Position.w)),                         float3 (0, 0, 1), -0.8); // 输出     float4颜色;colour.rgb = ( float3 ) tex2D (LightMap, intercept.xy * 0.8); colour.rgb += ( float3 ) tex2D (GroundMap, vert.uv); 颜色.a = 1;   返回颜色;}

总结

焦散比我想的短

GPU_GEMS_自然态_渲染水焦散相关推荐

  1. ue4光追降噪_【魔改UE4】后记_焦散效果总结

    我了解的的焦散共有三种做法: 贴图动画 实时焦散:Normal 挤出网格[我感觉非常漂亮,可以低成本模拟rtx效果] 实时焦散:rtx,主动点亮场景 以UE4 为例. 一.贴图动画 UE4 有一个实例 ...

  2. WebGL 水波及焦散(刻蚀)的渲染总结

    本文作者:木的树 关于小区域水波渲染以及焦散的技术原理,推荐下面两篇资源: https://github.com/martinRenou/threejs-caustics https://zhuanl ...

  3. webgl 基础渲染demo_WebGL + ThreeJS 实现实时水下焦散 Part 1

    知乎视频​www.zhihu.com 采用 WebGL 和 ThreeJS 运行实时焦散运算,需要一点相关基础.本文主要介绍焦散的原理以及计算方法 原作者 https://github.com/mar ...

  4. UE4 Material 101学习笔记——23-29 水涟漪/水深/折射反射/Gerstner海浪/波光焦散/泡沫/FlowMap

    UE4 Material 101学习笔记--23-29 水涟漪/水深/折射反射/Gerstner海浪/波光焦散/泡沫/FlowMap Lec23 水的表面涟漪 Water Ripples Shader ...

  5. ue4网格转地形_【魔改UE4】Rtx实时焦散的一次尝试

    这篇文章是这个系列最后一篇啦,前情回顾: 未名客:[魔改UE4]Realtime DynamicSkyLight_关于动态天空光照的一次尝试​zhuanlan.zhihu.com 未名客:[魔改UE4 ...

  6. 3dmax:3dmax三维VR渲染设置(VR发光贴图、VR灯光缓存、V-Ray焦散,渲染图中出现黑斑点的原因、插值类型)之详细攻略

    3dmax:3dmax三维VR渲染设置(VR发光贴图.VR灯光缓存.V-Ray焦散,渲染图中出现黑斑点的原因.插值类型)之详细攻略 目录 [VR发光贴图] 1.渲染图中出现黑斑点.杂点的几个原因: 1 ...

  7. Maya mental ray 焦散

    什么是焦散? 焦散是三维软件中的一个名词,它主要在后期渲染的时候,才会被提及.它的主要作用就是产生水波纹的光影效果,为了达到真实的效果,它可以计算很精致.准确的光影.但是好的效果,都是要付出渲染时间的 ...

  8. Caustics焦散

    Caustics焦散 转自百度百科 焦 散是一种很容易识别的间接照明效果.焦散的产生原理其实很简单:间接照明光线(即光子)从光源发射出来后,先经过一次(或多次) Specular 表面反.折射作用,再 ...

  9. Maya Mental Ray焦散效果

    在灯光开启焦散效果 在渲染器中开启焦散效果 焦散效果

最新文章

  1. 孙正义:未来30年投资趋势【附PPT】
  2. c4d支持mac系统渲染器有哪些_C4D常用的4大主流渲染器如何选择与比较 (OC/RS/VR/阿诺德)...
  3. android 获取sim卡,Android 获取手机SIM卡运营商
  4. mlflow_在生产中设置MLflow
  5. bind1nd\bind2nd
  6. 我的飞鸽传书程序,很好!!!
  7. 用Python爬取Bilibili视频,难吗?
  8. 数字风控全流程 实操课程V2.0 第三期
  9. VS 2003/VS 2005 迅雷资源下载网址
  10. android某个界面横屏,iOS强制某个界面横屏的方法
  11. sencha touch 2中list控件分组排序
  12. 一个最基本最简单的爬虫代码【精简】
  13. pix2pixHD总结
  14. 使用ARCore+Unity概述
  15. 弱监督学习-snorkel
  16. 【验证码逆向专栏】某片滑块、点选验证码逆向分析
  17. 今日网易邮箱126无法访问
  18. erp软件的主要功能
  19. matlab 嵌套循环
  20. 面试智力题:如何才能证明自己不怕老婆

热门文章

  1. 西瓜测试软件,西瓜视频v2.0.0
  2. Matlab之在城市环境中基于动态占用网格图的的运动规划仿真(附源码)
  3. linux at 邮箱,linux at 命令详解
  4. 三角形问题 -软件测试
  5. java实现国密加解密
  6. java 465发送邮件_465端口发送邮件失败
  7. Photoshop如何改变背景底色并调整照片尺寸和图像大小
  8. 《程序员的自我修养》笔记
  9. 《图说区块链》读书笔记(完整版)
  10. 利用requests库和Xpath爬取猫眼电影榜单【Python】