反射(Reflect)和折射(Refract)

BRDF 双向反射分布函数

 

反射:

R = 2 * N·L * N - L

 

已知量:

N:顶点的法向量

L:入射光向量,如果是平行光就直接用光的方向向量,如果是点光源,就通过光源位置顶点在世界空间的坐标进行计算。

未知量:

R:反射方向向量

总所周知,我们之所以能看见东西,是因为有光的照射,这说明所有我们所能看的到的颜色,都是来源于光的作用。光照射在像素上的时候,会产生多条光路,其中一种就是镜面反射。这里如果我们只考虑像素的镜面反射,则有:

像素的颜色 = 直接光照的镜面反射 + 场景的间接光照的镜面反射

1.直接光照的镜面反射:

这里的V表示的是像素点到视点的方向向量,世界空间里面。我们知道,R是L的反射向量,代表着光线的反射后的路线。那是不是表示,我们只有从R的位置看像素点的时候才能看到呢?显然是不是的,如果是的话我们会看不见很多东西。这里的R表示的是,我们能够看到最强的光的位置,如果我们从V的位置看的话,光

会进行一次衰减:(R.V)^n 其实n(反射系数)表示的是物体的反射能力。

2.间接光照的镜面反射:

光照到物体上后,只要不被完全吸收,就会辐射一部分出来,而此时这个物体也就具备了光源的性质,只不过这个性质是光源赐予它的。

由此,我们想,空间的物体的每个像素点都是一个间接光源,应该都具备1的特性才是,那为何我们一般感受不到呢?这是因为间接光照的辐射本身有限,当最终反射到我们眼中的时候,我们基本已经感觉不到它所造成的视觉差异了。但是,有几种情况下,我们是可以感受的到的。那就是当反射系数非常高的时候,例如镜子,我们就能从镜子里面看到其他的东西,这就是间接光镜面反射的作用。在所有当中,镜面反射是最强的,所以如果我们考虑类似全局光照中间接光源对物体产生的影响的时候,我们可以只考虑它的反射光或者只考虑它对周围物体的影响。

再说细节,由1可知,如果不是R方向上看像素点,所看到的结果不是最亮的,因为有一次R*V的衰减。而间接光本身就是很弱的,衰减后的基本上可以忽略。所以,现在我们把视点到像素的方向当做R,然后通过反射定律来寻找,是那个间接光源照射了这个像素点,最终只考虑这一个间接光源对像素的影响。结果就乘了第一个图了。已知R和N,求L,基本上所有的镜面反射场景,都是根据这个来的。

总结:直接光照侧重的是点亮像素,我们通过直接光源照射后看到了这个像素应有的颜色。而间接光源侧重的是自己,我们从视角通过反射,找到了此视角下对此像素影响最大的那个间接光源,所以,我们看到了它。

 

折射:

n1sinα1=n2sinα2

透射:光从一个介质穿过的时候,就叫做透射,它并不需要从一个介质进入到另外一个介质,光源存在于空气中并且在空气里传播就可以称做是透射了。它透过了某种介质了不是么,这个跟我们平常说的透过玻璃之类的理解不一样。透射,强调的是光在介质中传播会被吸收,或者被介质中的粒子发散,最终强度衰减为0.它强调的更多的是衰减的作用,我们使用pong光照模型的时候就强调了传播的距离对光的衰减。透射是基础,所有的反射,散射,折射都是透射,因为它们都存在衰减。

折射:强调的是光从一种介质传入到另一种介质的时候,所产生的影响。与反射一样,折射也有直接光源和间接光源的影响,直接光源让我们看到了这个物体。而我们又通过这个物体看到了物体后面的间接光源,这些间接光源因为折射的原因,位置还发生了偏移。

1.直接光折射:已知,L向量,N向量,n1介质系数,n2介质系数求Q向量。然后根据透射时的衰减,最终得到照射到像素时的亮度。这里跟反射一样,Q其实是你看到像素点最亮的方向,并非视角到像素的方向,还需要(Q.V)^n一下。

2.间接光折射:此时Q = V 成为已知量,N已知,n1和n2已知,求出L,然后通过L找出那个间接光源。

 

 

总结:

1.光只是一个能量,而光源就是这个能量的发源地,能量跋山涉水的进入到你的眼睛,眼睛的传感器会接受能量,通过神经传递给大脑,然后大脑对这个能量进行分析。突然强光入眼,会感觉很不适,这跟别人打你巴掌的效果是一样的。

2.光从光源辐射出来后,会在介质透射传播,传播的过程就是能量损耗的过程,之所以用能量来描述,是因为里面的力太多了,我们只需要关注衰竭后最终剩余的能量值就行了。不同的介质对光能的衰减能力不一样。比较弱的像气体,比较中等的如透明液体和大颗粒的灰尘,比较严重的就数固体了。

3.介质对光造成衰减的方式有很多,1.吸收,物体把光吸收后会提升自身的热量,这一部分光能转换成了热量不再传播。2.反射,光照到一个粒子上并不是只往一个方向上反射,而是向各个方向反射。只不过其中沿平面反射法线R方向的能量最高,它被单独分类为镜面反射,而其它的会相对镜面反射的能力衰减的很快,被称为散射。

4.当介质里面的粒子(所有小颗粒,包括灰尘,分子等的统称)很小且很少的时候,这个时候几乎可以对其忽略不计,等同于真空看待。

5.当介质里面的粒子比较少,且不是很小的时候,这些粒子会散射一部分光能,因为粒子比较小,镜面反射的影响被忽略。如果介质比较均匀,就是均匀介质散射,如果不均匀就是非均匀介质散射。

6.当介质比较小,但是比较多的时候,它们会明显的改变光路,产生折射效果。一般能产生折射的,都能产生散射效果。当然,出来产生折射效果以外,由于厚度的关系,有些位置的光穿不过,形成一种次表面散射的效果。

7.然后就是非常多分子,像液体,此时粒子的镜面反射作用明显,不可忽略,而又有折射和散射效果。所以说,液体是光照最复杂的模型,一点都不为过。

8.最后就是固体,要么吸收,要么反射,平面反射的影响比散射大。介质均匀的话介质中的每个粒子的法向量一致,就像玻璃一样的,可以忽略散射的影响。而介质非均匀的,粒子的平面反射方向不一致,最终把平面反射当做散射来看待。

9.pong光照模型:为了简化计算我们把那些影响有限的大多数光综合到一起,作为一个没有方向只有亮度的世界光来考虑。而介质吸收后反射的光的颜色用纹理进行描述,然后乘距离的衰减因子,反射,折射角的衰减,最终算出一个简单的光照模型。

 

别再死记硬背了!一张图带你理解反射折射的向量公式(附记忆技巧) 本文通过几何直觉向量分解方法,深入浅出地解析了反射折射的向量公式,帮助读者摆脱死记硬背。文章详细介绍了反射定律的镜面对称性折射定律的介质密度影响,并提供了独创的记忆技巧如'镜面舞步''密度跷跷板',使公式更易理解应用。 阅读详情

相关推荐

技术美术必看:5个HLSL函数让你的Shader效果瞬间提升(附实战代码)

本文为技术美术师提供5个关键HLSL函数(dot、cross、clamp、smoothstep、mul)的深度解析与实战应用,帮助提升Shader效果至电影级水准。通过Unity/Unreal引擎案例,展示如何利用这些函数实现边缘光、各向异性材质、动态扭曲等高级渲染效果,优化渲染管线性能。

weixin_30733003的博客 388

Java基础之—反射(非常重要)

反射是框架设计的灵魂 (使用的前提条件:必须先得到代表的字节码的Class,Class类用于表示.class文件(字节码)) 一、反射的概述 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性方法;对于任意一个对象,都能够调用它的任意一个方法属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的

敬业小码哥的博客 76万+

GLSL中环境映射&菲涅尔反射效果

立方体贴图纹理与菲涅尔反射效果(Fresnel reflection)简介 ↑ 环境映射 光滑物体表面的鏡面反射效果及投射效果可以极大提升渲染场景的真实性。然而,为了正确模拟这类效果,需要用到光线追踪等非常耗时的方法。由于影响渲染物体的外在因素只有周围的远景,我们可以直接使用周围环境的远景贴图来实现这种效果。这种方法称为环境映射,一般分为贴在球体上的球形映射(Sphere map

【计算机图形】Physics-Based Animation-小8君的专栏 4758

光线追踪技术的理论实践(面向对象)

光线追踪技术的理论实践(面向对象) Theory & Practice of Raytracing(Object Oriented) 这篇文章将介绍光线追踪技术。在计算机图形领域中,这种技术被普遍应用于生成高质量的照片级图像。在为一个场景计算光照的时候,通过固定...

GAIA LABORATORY FOR GRAPHICS 2万+

CG之refract函数简单实现

CG的refract函数定义如下: refract(I, N, eta)  根据入射光线方向I,表面法向量N折射相对系数eta,计算折射向量。如果对给定的eta,IN之间的角度太大,返回(0,0,0)。只对三元向量有效。 它的一个简单实现如下: 1 float3 refract(float3 i, float3 n, float eta) 2 { 3 float c...

weixin_30569033的博客 518

什么是反射

什么是反射? Java 反射,就是在运行状态中。 获取任意类的名称、package信息、所有属性、方法、注解、类型、类加载器等 获取任意对象的属性,并且能改变对象的属性 调用任意对象的方法 判断任意一个对象所属的类 实例化任意一个类的对象 Java 的动态就体现在这。通过反射我们可以实现动态装配,降低代码的耦合度;动态代理等。反射的过度使用会严重消耗系统资源。 JDK 中 jav...

ConstXiong 5万+

openGL GLSL GLSL.Refract & Reflect & Diffraction 反射折射、衍射Fresnel Effect

一、Refract & Reflect Snell定律描述了光线从一个介质传播到另外一个介质时,入射角、折射角以及介质折射率的关系。通过snell定律,可以根据入射光的方向向量求取折射光的方向向量。 Fresnel定律完善了光的衍射理论,当光线到达材质交界面时,一部分光被反射,另外一部分发生折射,这个现象被称为Fresnel Effect。菲涅尔现象混合了反射折射,使得物体更加真实,理论物理中的Fresnel公式很复杂,因而在实时计算机图形学中,只要在最终效果上满足人们的视觉感受就可以了。在C.

aoxuestudy的专栏 2168

Opengl-立方体贴图(天空盒子)

立方体贴图就是一个包含了6个2D纹理的纹理,每个2D纹理都组成了立方体的一个面:一个有纹理的立方体。你可能会奇怪,这样一个立方体有什么用途呢?为什么要把6张纹理合并到一张纹理中,而不是直接使用6个单独的纹理呢?立方体贴图有一个非常有用的特性,它可以通过一个方向向量来进行索引/采样。假设我们有一个1x1x1的单位立方体,方向向量的原点位于它的中心。使用一个橘黄色的方向向量来从立方体贴图上采样一...

alex1992azh的博客 3215

Chapter 11-Mirror, Mirror, On the Wall之反射折射

本章理论非常简单,示例程序中的四个实际上真真正正跟本章主题能挂上钩的也就是反射折射这两个演示程序了,最后的一个程序是折射反射的叠加,没啥技术含量,只要反射折射都搞明白了,最后这个演示简直就是浮云。 背景绘制就省略了,前几章也已经练习过好多次了。 我们看看反射折射。   基本原理: 1. 反射——将ViewVector向量看作是反射光...

weixin_30293079的博客 160

Cg(C for Graphic)标准函数库之数学函数与几何函数

C 的标准函数库类似, Cg 提供了一系列内建的标准函数。这些函数用于执行数学上的通用计算或通用算法(纹理映射等),例如,需要求取入射光线的反射光线方向向量可以使用标准函数库中的 reflect 函数,求取折射光线方向向量可以使用 refract 函数,做矩阵乘法运算时可以使用 mul 函数。 有些函数直接 GPU 指令相对应,所以执行效率非常高。绝大部分标准函数都被重载过,用于...

243

UnityShader_泳池实现

一个水上、水底的UnityShader实现!!效果十分好

weixin_40301728的博客 2459

Vulkan_Shader—环境映射天空盒

环境映射 我们现在将整个环境映射到了一个纹理对象上了,能利用这个信息的不仅仅只有天空盒。通过使用环境的立方体贴图,我们可以给物体反射折射的属性。这样使用环境立方体贴图的技术叫做环境映射(Environment Mapping),其中最流行的两个是反射(Reflection)折射(Refraction)。 在介绍这两种之前,我们先把,天空盒的顶点片元着色器贴出来,很常规: 顶点着色器: #ve...

qq_35312463的博客 1187

Shader实例:高级纹理应用

Shader实例:高级纹理应用 首先说下CubeMap的几种制作方式: 第一种方法:就是提供一张具有特殊布局的纹理(如:立方体展开贴图交叉布局,全景布局等)用的时候把Texture Type设置成Cubemap(优点:这种方法可以对纹理数据进行压缩,而且可以支持边缘修正,光滑反射HDR等功能); 第二种方法:先创建一个CubeMap,然后赋予6张贴图; 第三种方法: 这种方法比较灵活,

一入編程深似海! 611

Shader笔记十一 高级纹理

高级纹理立方体纹理立方体纹理(CubeMap)是 环境映射(Enviroment Mapping) 的一种实现方式。立方体纹理包含6张图像,每个面表示沿着世界空间下的轴向(上、下、左、右、前、后) 观察所得的图像。对立方体纹理的采样需要提供三维纹理坐标,表示在世界空间下的一个3D方向,方向矢量从立方体中心出发,向外部延伸就会立方体的6个纹理之一发生相交,采样结果由交点计算而来。立方体纹理在实时渲...

O213的博客 471

Reflect & Refract (以水渲染为例)

我不是Shader帝,虽然知道Shader怎么写,但一直没仔细研究过。最近蛋疼至极,研究了下RenderMonkey,于是抽着几个看着比较有趣的效果做了一下。   先前的模型贴花http://www.cppblog.com/Leaf/archive/2011/01/07/138093.html CUBE MAP http://www.cppblog.com/Leaf/archive/201

BoYueJiang's Zone 1218

WebGPU玻璃材质渲染:反射折射与菲涅尔效应的完整实现

在实时渲染中,材质是决定三维物体真实感的核心要素。玻璃是最难模拟的材质之一,其视觉特性源于反射折射与菲涅尔效应的共同作用——光线在不同观察角度下呈现截然不同的反射与透射比例。传统WebGL受限于API设计,难以高效处理复杂的纹理采样与光学计算。新一代WebGPU图形标准通过可编程着色器WGSL与灵活的绑定模型,为实时渲染提供了更接近现代显卡架构的技术路径。基于环境贴图与光栅化管线,以Schlick近似模拟菲涅尔因子,即可在片元着色器中逐像素实现逼真的玻璃光学效果。这套技术方案广泛适用于3D产品展示、虚拟展

weixin_30697239的博客 287

Unity光线反射折射实战:从向量推导到递归追踪实现

在计算机图形学与游戏开发中,光线与物体表面的交互是构建逼真视觉体验的核心基础。其原理基于几何光学,通过向量运算精确描述光线的反射折射行为。掌握这些底层技术,不仅能深化对渲染管线的理解,更能为开发高级视觉效果(如水面倒影、玻璃透射)提供扎实的理论支撑。反射遵循入射角等于反射角的定律,其向量公式 R = I - 2*(I·N)*N 高效且优雅;折射则由斯涅尔定律(Snell's Law)支配,需处理光线穿越不同介质(如空气、水、玻璃)时的方向偏折与全反射临界现象。在工程实践上,开发者常在Unity等引擎中,通

weixin_34320724的博客 377

Unity Shader立方体纹理:从原理到实战的环境反射折射实现

在计算机图形学中,纹理映射是增强3D模型表面细节的核心技术。2D纹理通过UV坐标将图像映射到模型表面,而立方体纹理则采用方向向量采样机制,模拟三维空间的全景环境光照。其原理基于方向向量与立方体六个面的交点计算,实现从特定视角对环境图像的采样。这项技术的核心价值在于能够高效模拟物理真实的环境反射折射及天空盒效果,显著提升场景的沉浸感与视觉保真度。在游戏开发、虚拟现实实时渲染等应用场景中,立方体纹理是实现动态环境反射、玻璃与水面折射以及全景天空渲染的关键。本文聚焦于Unity Shader中的立方体纹理,深

weixin_34062469的博客 422
上一篇: 3D 矩阵和向量空间
下一篇: 球谐波光照(Spherical Harmonic Lighting)
lengbingteng
博客等级 码龄18年 25粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值