目录
(资料图片)
1.生成Cubemap
2.环境映射
2.1反射
2.2折射
2.3菲涅尔反射
官方的文档中的生成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在后面的步骤会用到
随视角变换看到不同的图形
反射方向:Reflect(- 视角方向,法线方向)使用 texCUBE(_CubeMap,反射方向), 对_CubeMap采样
与漫反射混合
理解
CubeMap将相机在球位置上的各个方向看到结果都保存起来
texCUBE()函数可以由方向反推得到颜色
于是, 球的表面顶点的反射结果为, 视角反射方向, 对应在CubeMap上的颜色
核心代码(Texture_uv.shader上修改)
完整代码Texture_uv_cubeMap.shader
斯涅尔定律 η1sinθ1=η2sinθ2
透射比 η2/η1 (出射/入射)
而在Unity中, 使用Refact计算即可
折射方向 Refact(-viewDir,worldNormalDir,_RefractRatio)
核心代码
使用refract代替reflect, 将反射改为折射
入射角大,反射效果强而清晰,入射角小,反射效果弱而模糊的现象
理论
当光线照射到物体表面时,一部分反射或者折射,一部分进入了物体内部。被反射的光和入射光之间存在一定的比率关系,这个比率和你观察物体表面的角度有关。
主要使用的近似公式有两种
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
邮箱 : 58 55 97 3@qq.com