菲涅尔反射

菲涅尔反射 :视线垂直于表面时,反射较弱,而当视线非垂直表面时,夹角越小,反射越明显.

例如:如果你站在湖边,低头看脚下的水,你会发现水是透明的,反射不是特别强烈;如果你看远处的湖面,你会发现水并不是透明的,但反射非常强烈

Schlick菲涅尔近似等式!

F0是一个反射系数,用于控制菲涅尔反射的强度,v是视角方向,n是表面法线

Shader "QShader/FresnelReflection_schlick"{
    Properties{
        _BaseColor("Base Color",Color) = (1.0,1.0,1.0,1.0)
        _FresnelScale("Fresnel Scale",Range(0,1)) = 0.5
        _Cubemap("Cubemap",Cube) = "skybox"{}
    }
        SubShader{
            pass {
                Tags{"LightMode" = "ForwardBase"}
                CGPROGRAM
                #pragma vertex Vertex
                #pragma fragment Fragment
                #include "Lighting.cginc"
                #include "AutoLight.cginc"

                struct a2v {
                    float4 vertex : POSITION;
                    float3 normal : NORMAL;
                };

                struct v2f {

                    float4 pos : SV_POSITION;
                    float3 worldNormal : TEXCOORD0;
                    float3 worldPos : TEXCOORD1;
                    float3 worldViewDir : TEXCOORD2;
                    float3 worldReflectDir : TEXCOORD3;
                    SHADOW_COORDS(4)
                };

                fixed4 _BaseColor;
                fixed _FresnelScale;
                samplerCUBE _Cubemap;

                v2f Vertex(a2v v) {

                    v2f o;
                    o.pos = UnityObjectToClipPos(v.vertex);
                    o.worldNormal = UnityObjectToWorldNormal(v.normal);
                    o.worldPos = mul(unity_ObjectToWorld,v.vertex);
                    o.worldViewDir = UnityWorldSpaceViewDir(o.worldPos);
                    o.worldReflectDir = reflect(-o.worldViewDir,o.worldNormal);

                    TRANSFER_SHADOW(o)
                    return o;
                }

                fixed4 Fragment(v2f i) :SV_TARGET{
                    //世界下法线向量
                    fixed3 worldNormal = normalize(i.worldNormal);
                    //光源向量
                    fixed3 lightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
                    //视角向量
                    fixed3 worldViewDir = normalize(i.worldViewDir);
                    //环境光
                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * _BaseColor.xyz;
                    //漫反射
                    fixed3 diffuse = _LightColor0.xyz * _BaseColor.xyz * saturate(dot(worldNormal,lightDir));

                    //schlick菲涅尔反射公式
                    float fresnel = _FresnelScale + (1 - _FresnelScale) * pow(1 - dot(worldNormal,worldViewDir),5);
                    //反射
                    fixed3 reflection = texCUBE(_Cubemap,i.worldReflectDir).xyz;
                    //计算光照衰减
                    UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);
                    //将菲涅尔反射系数作为线性插值的权重在物体原本的漫反射颜色和反射颜色之间进行过度
                    fixed3 color = ambient + lerp(diffuse,reflection,saturate(fresnel)) * atten;

                    return fixed4(color,1.0);
                }
                ENDCG
            }
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
菲涅尔反射系数是描述光线从介质A射向介质B时,发生反射和折射的现象的物理量。在光的折射和反射中,菲涅尔反射系数用于描述光的入射波和反射波之间的关系。 Matlab是一种常用的科学计算和数据可视化工具,可以用来计算菲涅尔反射系数。我们可以利用Matlab中的物理光学库或者自定义函数来计算菲涅尔反射系数。 首先,我们需要确定介质A和介质B的折射率nA和nB。然后根据入射角度和折射角度的关系,可以使用Fresnel公式计算出垂直入射光的反射系数。 具体计算步骤如下: 1. 在Matlab中定义介质A和介质B的折射率nA和nB。 2. 输入入射角度θ,可以使用matlab函数sind和cosd将角度转换为弧度。 3. 根据Fresnel公式计算反射系数: - 入射波的振幅反射系数r_perpendicular = (nA * cos(θ) - nB * sqrt(1 - (nA/nB)^2 * sind(θ)^2)) / (nA * cos(θ) + nB * sqrt(1 - (nA/nB)^2 * sind(θ)^2)) - 入射波的振幅透射系数t_perpendicular = (2 * nA * cos(θ)) / (nA * cos(θ) + nB * sqrt(1 - (nA/nB)^2 * sind(θ)^2)) 4. 计算垂直入射光的反射系数R = r_perpendicular^2 和透射系数T = t_perpendicular^2。 通过以上步骤,我们可以得到菲涅尔反射系数R和透射系数T。在Matlab中,我们可以输入不同的折射率和入射角度,计算不同介质间的反射系数。 此外,我们还可以使用Matlab绘制出折射率和反射系数之间的关系图,以更好地理解光在不同介质中的传播过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值