22.Shader-CubeMap环境映射

来源:哔哩哔哩 时间:2023-06-17 20:55:03

目录


(资料图片)

1.生成Cubemap

2.环境映射

2.1反射

2.2折射

2.3菲涅尔反射

1.生成Cubemap

官方的文档中的生成CubeMap代码, Copy就行

https://docs.unity3d.com/cn/2023.1/ScriptReference/Camera.RenderToCubemap.html

生成步骤:

1.在Assets目录中, 右键 Create/Legacy/Cubemap  

到一张空白CubeMap

2.打开菜单栏GameObject/Render into Cubemap

拖拽填上拍摄位置和CubeMap, 渲染,即可生成

这个CubeMap在后面的步骤会用到

2.1CubeMap反射

随视角变换看到不同的图形

反射方向:Reflect(- 视角方向,法线方向)

使用  texCUBE(_CubeMap,反射方向), 对_CubeMap采样

与漫反射混合

理解

CubeMap将相机在球位置上的各个方向看到结果都保存起来

texCUBE()函数可以由方向反推得到颜色

于是, 球的表面顶点的反射结果为, 视角反射方向, 对应在CubeMap上的颜色

核心代码(Texture_uv.shader上修改)

完整代码Texture_uv_cubeMap.shader

2.2折射

斯涅尔定律  η1sinθ1=η2sinθ2

透射比 η2/η1  (出射/入射)

而在Unity中, 使用Refact计算即可

折射方向 Refact(-viewDir,worldNormalDir,_RefractRatio)  

核心代码

使用refract代替reflect, 将反射改为折射

2.3菲涅尔反射

入射角大,反射效果强而清晰,入射角小,反射效果弱而模糊的现象

理论

当光线照射到物体表面时,一部分反射或者折射,一部分进入了物体内部。被反射的光和入射光之间存在一定的比率关系,这个比率和你观察物体表面的角度有关。  

主要使用的近似公式有两种  

Schlick菲涅尔反射公式

Fs = F0 + (1-F0)(1-v· n)^5

F0是反射系数(反射强度),v是视角方向,n是表面法线。  

Empricial菲涅尔反射公式

Fe = saturate( bias+scale*(1-v· n)^power )

其中bias,scale,power是控制项。

两个公式不需要理解, 是根据现实材质反射模拟的近似函数, 现实的各种材质的反射规律又各有不同。 

核心代码

完整代码 Texture_cubeMap_schlick.shader

在工程中效果不明显

当_ReflectAmount调为0时,边缘会有反射

完整代码: https://github.com/smartgrass/MyCodes/tree/main/ShaderLearning

下一篇: 渲染纹理 和 玻璃效果和GrabPass

关键词:

推荐内容

Copyright 2000-2021 by www.jiaoyu.nanfei.cn all rights reserved

备案号:沪ICP备2022005074号-13

邮箱 : 58 55 97 3@qq.com