22.Shader-CubeMap環(huán)境映射
目錄
1.生成Cubemap
2.環(huán)境映射
??? 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, 渲染,即可生成

這個(gè)CubeMap在后面的步驟會用到

2.1CubeMap反射
隨視角變換看到不同的圖形

使用? texCUBE(_CubeMap,反射方向), 對_CubeMap采樣
與漫反射混合
理解
CubeMap將相機(jī)在球位置上的各個(gè)方向看到結(jié)果都保存起來
texCUBE()函數(shù)可以由方向反推得到顏色
于是, 球的表面頂點(diǎn)的反射結(jié)果為, 視角反射方向, 對應(yīng)在CubeMap上的顏色

核心代碼(Texture_uv.shader上修改)
完整代碼Texture_uv_cubeMap.shader
2.2折射

斯涅爾定律 ?η1sinθ1=η2sinθ2
透射比 η2/η1 ?(出射/入射)
而在Unity中, 使用Refact計(jì)算即可
折射方向 Refact(-viewDir,worldNormalDir,_RefractRatio) ?
核心代碼
使用refract代替reflect, 將反射改為折射

2.3菲涅爾反射
入射角大,反射效果強(qiáng)而清晰,入射角小,反射效果弱而模糊的現(xiàn)象

理論
當(dāng)光線照射到物體表面時(shí),一部分反射或者折射,一部分進(jìn)入了物體內(nèi)部。被反射的光和入射光之間存在一定的比率關(guān)系,這個(gè)比率和你觀察物體表面的角度有關(guān)。 ?
主要使用的近似公式有兩種 ?
Schlick菲涅爾反射公式
Fs = F0 + (1-F0)(1-v· n)^5
F0是反射系數(shù)(反射強(qiáng)度),v是視角方向,n是表面法線。 ?
Empricial菲涅爾反射公式
Fe = saturate( bias+scale*(1-v· n)^power )
其中bias,scale,power是控制項(xiàng)。
兩個(gè)公式不需要理解, 是根據(jù)現(xiàn)實(shí)材質(zhì)反射模擬的近似函數(shù), 現(xiàn)實(shí)的各種材質(zhì)的反射規(guī)律又各有不同。?
核心代碼
完整代碼 Texture_cubeMap_schlick.shader
在工程中效果不明顯

當(dāng)_ReflectAmount調(diào)為0時(shí),邊緣會有反射


完整代碼: https://github.com/smartgrass/MyCodes/tree/main/ShaderLearning
下一篇: 渲染紋理 和 玻璃效果和GrabPass