Unity Shader中关于菲涅尔反射

原创 2018年04月17日 18:57:33

在学习<<Unity Shader 入门精要>>的时候看到关于菲涅尔反射的部分,由于打错代码得到一个意想不到的结果

先PO出代码:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "Unity Shaders Book/Chapter 10/Fresnel"
{
    Properties
    {
        _Color ("Color Tint",Color)=(1,1,1,1)
        _FresnelScale ("Fresnel Scale",Range(0,1))=0.5
_Cubemap("Reflection Cubemap",Cube)="_Skybox" {}
    }
    SubShader
    {
        Tags{"RenderQueue"="Opaque" "Type"="Geometry"}

        pass
        {
            Tags {"LightMode"="ForwardBase"}

            CGPROGRAM
            #pragma multi_compile_fwdbase
#pragma vertex vert
            #pragma fragment frag

#include "Lighting.cginc"
            #include "AutoLight.cginc"

            fixed4 _Color;
            fixed _FresnelScale;
            samplerCUBE _Cubemap;

            struct a2v
            {
float4 vertex:POSITION;
             float3 normal:NORMAL;
            };
            struct v2f
            {
float4 pos:SV_POSITION;
             float3 worldPos:TEXCOORD0;
             fixed3 worldNormal:TEXCOORD1;
             fixed3 worldViewDir:TEXCOORD2;
             fixed3 worldRefl:TEXCOORD3;
             SHADOW_COORDS(4)
            };
            v2f vert(a2v v)
            {
                v2f o;
                o.pos=UnityObjectToClipPos(v.vertex);
                o.worldPos=mul(unity_ObjectToWorld,v.vertex);
                o.worldNormal=UnityObjectToWorldNormal(v.normal);
                o.worldViewDir=UnityWorldSpaceViewDir(o.worldPos);
                o.worldRefl=reflect(-o.worldViewDir,o.worldNormal);
                TRANSFER_SHADOW(o);
                return o;
            }
            fixed4 frag(v2f i):SV_TARGET
            {
                fixed3 worldNormal=normalize(i.worldNormal);
                fixed3 worldViewDir=normalize(i.worldViewDir);
                fixed3 worldLightDir=normalize(UnityWorldSpaceLightDir(i.worldPos));

                fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;

                fixed3 reflection=texCUBE(_Cubemap,i.worldRefl).rgb;
fixed3 diffuse=_LightColor0.rgb*_Color.rgb*max(0,dot(worldViewDir,worldNormal));
                fixed3 fresnel=_FresnelScale+(1-_FresnelScale)*pow(1-worldViewDir*worldNormal,5);
                UNITY_LIGHT_ATTENUATION(atten,i,i.worldPos);
                fixed3 color=ambient+lerp(diffuse,reflection,saturate(fresnel))*atten;
                return fixed4(color,1.0);
            }
            ENDCG
        }
    }
    fallback "Reflective/VertexLit"
}

这部分代码中在片元着色器中计算菲涅尔公式的时候弄错了

Sclick菲涅尔近似公式应该为:F=F0+(1-F0)(1-dot(v,n))^5,其中F0为一个反射系数,对应代码中为FresnelScale,用于控制菲涅尔反射的强度,v为视觉方向,n为表面法线

可以注意到的是代码中的菲涅尔公式变为F0+(1-F0)(1-v*n)^5

 所以当FresnelScale为0的时候则得到下图结果


而按照正确的菲涅尔反射则应为


3D数学在Unity中运用

-
  • 1970年01月01日 08:00

Unity Shader学习笔记:菲涅耳反射

菲涅耳反射反射描述了一种光学现象,即当光线照射到物体表面上时,一部分发生反射,一部分进入了物体内部,发生折射或散射。被反射的光和入射光之间存在一定的比率关系,这个比率关系可以通过菲涅耳等式进行计算。 ...
  • SHIYUEDYX
  • SHIYUEDYX
  • 2017-08-29 15:27:41
  • 477

Unity Shader菲涅耳反射(Fresnel)

菲涅尔反射经常用于汽车表面的材质,普通的反射看上去比较粗略,菲涅尔的效果和镜面效果会让汽车表面看的更有质感,并且创建一种边缘光照的效果。 不是所有的表面都要相同数量的菲涅尔光照,想汽车表面的话需要...
  • HeBiReChenAi
  • HeBiReChenAi
  • 2016-10-26 10:51:22
  • 2856

Unity Shader:实现菲涅尔+色散效果以及相关原理解析

1,色散在光学中的原理 2,反射的原理以及环境映射的实现 3,折射的原理以及色散的实现 4,菲涅尔效果 5,将菲涅尔与色散效果增加到环境映射中1,色散在光学中的原理复色光 ——现实生活中的许...
  • liu_if_else
  • liu_if_else
  • 2017-06-20 20:16:54
  • 1796

Unity Shaders and Effects Cookbook (4-5)Cubemap与菲涅尔反射

当我们站在水中,直直的往下看水面,是看不到反射的太阳光的。而当我们往远处看时,就能看到很强的反光,也就是成语波光粼粼所体现的。这一现象就被命名为 菲涅尔反射。...
  • cp790621656
  • cp790621656
  • 2016-04-24 02:30:47
  • 6258

Unity shader(CG) 写一个 散色、折射、反射、菲涅尔、gamma、简单后期屏幕特效

Unity shader(CG) 写一个 散色、折射、反射、菲涅尔、gamma、简单后期屏幕特效1.自生要求是很重要的,当然不是什么强迫工作之类的,而是自己有限的能力上不断的扩展兴趣上的内容。 2....
  • baidu_26153715
  • baidu_26153715
  • 2015-05-01 16:22:33
  • 7005

UnityShader中级篇——菲涅尔反射

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld' // Upgrade NOTE: replaced 'mul(...
  • weixin_37994402
  • weixin_37994402
  • 2018-02-28 18:31:34
  • 39

GLSL中环境映射&菲涅尔反射效果

立方体贴图纹理与菲涅尔反射效果(Fresnel reflection)简介 ↑ 环境映射 光滑物体表面的鏡面反射效果及投射效果可以极大提升渲染场景的真实性。然而,为了正确模拟这类效果...
  • Knight_Lyh
  • Knight_Lyh
  • 2017-01-23 17:55:28
  • 1078

反射折射和菲涅耳近似

先来几个图:  首先需要有一个单位球,球心就放在摄像机处,随时保持。 接下来载入我们的立方体贴图,当然是已经做好的,然后贴到球上,注意关掉ZWRITE和背面裁剪,这样就完成一个静态的环境贴图了。如果要...
  • lovelyloulou
  • lovelyloulou
  • 2010-06-23 18:30:00
  • 2290

菲涅尔透镜的原理及应用

1.  菲涅尔透镜的作用 菲涅尔透镜,简单的说就是在透镜的一侧有等距的齿纹。通过这些齿纹,可以达到对指定光谱范围的光带通(反射或者折射)的作用。传统的打磨光学器材的带通光学滤镜造价昂贵,菲涅尔透...
  • husion01
  • husion01
  • 2013-06-20 14:21:37
  • 4461
收藏助手
不良信息举报
您举报文章:Unity Shader中关于菲涅尔反射
举报原因:
原因补充:

(最多只允许输入30个字)