偏引擎技术


一、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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值