光照技术独立部分
一、GI,间接光部分
示例:InDir部分,还是有许多容易搞错记混得内容。
1.高光反射
使用CubeMap采样反射
在手里已经有一个CubeMap的时候,想用它来作为我们物体的镜面反射,需要将其首先转换一下卷积模式(预处理),变成specular,这样调整mipmap的时候,他渐变的会更加线性。
切换模式ON
切换模式OFF
half roughness = tex2D(_RoughnessMap, i.uv);
roughness = saturate(pow(roughness, _RoughnessContrast) * _RoughnessBrightness);
roughness = lerp(_RoughMin, _RoughMax, roughness);
roughness = roughness * (1.7 - 0.7 * roughness);
roughness *= 6.0;
half3 col = DecodeHDR(texCUBElod(_CubeMap, float4(R, roughness)), _CubeMap_HDR);
使用UNITY场景里设置的的CubeMap采样反射
上面的采样方法我们使用自己提供的预处理过得CubeMap获得的结果。我们也可以使用UNITY_SAMPLE_TEXCUBE_LOD(unity_SpecCube0, R, roughness)来取到Unity默认场景里LightingSettings里的默认天空cubemap。如上图所示。
2.漫反射
(1)内置球谐
有关于间接漫反射,其实方法有三种,但是他们的核心都是通过球谐来完成的。
第一种可以直接使用Unity内置的计算球谐漫反射数据的函数。
half3 col = ShadeSH9(float4(N, 1.0));
(2)CubeMap的粗糙度模式计算球谐
第二种我们可以使用类似高光反射采样来模拟某一个特定环境下(Cubemap里的环境)进行漫反射计算
half roughness = tex2D(_RoughnessMap, i.uv);
roughness = saturate(pow(roughness, _RoughnessContrast) * _RoughnessBrightness);
roughness = lerp(_RoughMin, _RoughMax, roughness);
roughness = roughness * (1.7 - 0.7 * roughness);
roughness *= 6.0;
half3 col = DecodeHDR(texCUBElod(_CubeMap, float4(N, roughness)), _CubeMap_HDR);
这里提一句,如果要使用一个cubemap来计算漫反射的话,还是要修改卷积模式(预处理)
(3)插件获取CubeMap球谐数据
第三种我们使用插件来计算出某一个CubeMap的漫反射数据,然后赋值给我们的Shader