美文网首页
Shader-FresnelReflection(菲涅尔反射)

Shader-FresnelReflection(菲涅尔反射)

作者: 祝你万事顺利 | 来源:发表于2019-06-17 11:07 被阅读0次

菲涅尔公式:用来描述光在不同折射率的介质之间的行为。用公式推导出的光的反射称之为“菲涅尔反射”。

fresnelRes.PNG

应用:运用于类似水面的效果,在近的地方反射较少,看远的地方反射较多。这种效果称之为菲涅尔效应。

在用系统简化公式提升效率:
fresnel = fresnel基础值 + fresnel缩放量*pow( 1 - dot( N, V ), 5 )
N-法线
V-观察向量
L-平行光方向

Shader "Unlit/FresnelReflection"
{
    Properties
    {
        _MainTex("Texture", 2D) = "white" {}
        _fresnelBase("fresnelBase", Range(0, 1)) = 1
        _fresnelScale("fresnelScale", Range(0, 1)) = 1
        _fresnelIndensity("fresnelIndensity", Range(0, 5)) = 5
        _fresnelCol("_fresnelCol", Color) = (1,1,1,1)
    }

        SubShader
    {
        Tags{ "RenderType" = "Opaque" }
        LOD 100

        Pass
    {
        tags{ "lightmode=" = "forward" }

        CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"
#include "Lighting.cginc"

        struct appdata
    {
        float4 vertex : POSITION;
        float2 uv : TEXCOORD0;
        float3 normal : NORMAL;
    };

    struct v2f
    {
        float2 uv : TEXCOORD0;
        float4 vertex : SV_POSITION;
        float3 L : TEXCOORD1;
        float3 N : TEXCOORD2;
        float3 V : TEXCOORD3;
    };

    sampler2D _MainTex;
    float4 _MainTex_ST;

    float _fresnelBase;

    float _fresnelScale;

    float _fresnelIndensity;

    float4 _fresnelCol;

    v2f vert(appdata v)
    {
        v2f o;
        o.vertex = UnityObjectToClipPos(v.vertex);
        o.uv = TRANSFORM_TEX(v.uv, _MainTex);
        //将法线转到世界坐标
        o.N = mul(v.normal, (float3x3)unity_WorldToObject);
        //获取世界坐标的光向量
        o.L = WorldSpaceLightDir(v.vertex);
        //获取世界坐标的视角向量
        o.V = WorldSpaceViewDir(v.vertex);
        return o;
    }

    fixed4 frag(v2f i) : SV_Target
    {
        fixed4 col = tex2D(_MainTex, i.uv);

    float3 N = normalize(i.N);
    float3 L = normalize(i.L);
    float3 V = normalize(i.V);

    col.rgb *= saturate(dot(N, L)) * _LightColor0.rgb;
    //菲尼尔公式
    float fresnel = _fresnelBase + _fresnelScale * pow(1 - dot(N, V), _fresnelIndensity);

    col.rgb += lerp(col.rgb, _fresnelCol, fresnel) * _fresnelCol.a;

    return col;
    }

        ENDCG
    }
    }
}

fresnelBase表示基础值,fresnelScale表示fresnel效果系数,fresnelIndensity增强次数

fresnelSet.PNG

相关文章

  • Shader-FresnelReflection(菲涅尔反射)

    菲涅尔公式:用来描述光在不同折射率的介质之间的行为。用公式推导出的光的反射称之为“菲涅尔反射”。 应用:运用于类似...

  • [光照]菲涅尔反射

    1.综述 有一种情况,当我们站在湖边直接看脚边的湖面会发现水几乎是透明的,可以直接看到水底的小鱼和石子,但是抬头看...

  • VR家装-Tips-玻璃

    玻璃一般情况下是黑色或者深墨绿色,注意菲涅尔反射、折射、透明三个值玻璃材质具有的3大特点。 菲涅尔反射:正对摄影机...

  • 四、其他:一些基本概念02

    1、UnityShader-菲涅尔反射(Fresnel Reflection) 用来描述光在不同折射率的介质之间的...

  • Zemax VR菲涅尔设计总结

    目前VR菲涅尔透镜使用一面凸面,一面菲涅尔面; 用理想菲涅尔设计有可能不能加工; 波长设计最好使用屏幕的RGB波长...

  • UnityShader-菲涅尔反射(Fresnel Reflec

    菲涅耳公式(或菲涅耳方程),由奥古斯丁·让·菲涅耳导出。用来描述光在不同折射率的介质之间的行为。由公式推导出的光的...

  • 24 菲涅尔节点

    金属的菲涅尔非常弱

  • Fresnel反射

    Fresnel反射 菲涅尔反射是指当光入射到折射率不同的两个媒质分界面时,一部分光会被反射的现象。如果光在光纤中的...

  • Shader学习10——边缘光

    边缘光的参考有很多,我们使用最简单的纯色菲涅尔反射,就是越外边颜色越亮。效果如下: 代码如下: 2021.3.26...

  • 菲涅尔 Fresnel

    奥古斯汀·菲涅耳 Augustin Fresnel(1788~1827),法国土木工程师兼物理学家。 菲涅耳的科学...

网友评论

      本文标题:Shader-FresnelReflection(菲涅尔反射)

      本文链接:https://www.haomeiwen.com/subject/arvofctx.html