当前位置: 首页 > article >正文

Unity图形学之菲尼尔色散Fresnel

1.描述多少光被反射,多少被折射,用来渲染一种类似瓷砖表面有釉的那种感觉或者木头表面清漆的效果

2.计算公式:

C(fresnelFinal) =  reflectFact *C (reflect)+(1-reflectFact)* C (refract)

(1)反射因子怎么计算:

fresnelBias      菲尼尔偏移系数
fresnelScale     菲尼尔缩放系数
fresnelPower     菲尼尔指数


reflectFactor =  fresnelBias+fresnelScale*pow(1+dot(viewDir,N),fresnelPower);

(2)反射计算公式:

C (reflect)=  reflect(viewDir,N);

(3)折射计算公式:

C (refract)   =refract (viewDir,N,eatRatio)

Shader "Custom/Fresnel"
{
    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _SubTex ("SubTex (RGB)", CUBE) = "white" {}
        
        _EatRation("EatRation",float) = 1.2   //折射率
        _FresnelBias("FresnelBias",float) = 1 //菲尼尔偏移系数
        _FresnelScale("FresnelScale",float) = 1 //菲尼尔缩放系数
        _FresnelPower("FresnelPower",float) = 0.5 //菲尼尔指数
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all  light types
        #pragma surface surf Lambert vertex:MyVertex
        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0
        sampler2D _MainTex;
        samplerCUBE _SubTex;
        struct Input
        {
            float2 uv_MainTex;
            float3 worldRefl;
            //折射
            float3 refract;
            //反射系数
            float reflectFact;
        };
       
       fixed4 _Color;
       float _EatRation;
       float _FresnelBias;
       float _FresnelPower;
       float _FresnelScale;
       void MyVertex(inout appdata_full v,out Input data)
       {
           //初始化Input变量
            UNITY_INITIALIZE_OUTPUT(Input,data);  
           //计算法线,法线转化到local
           float3 localNormal =  normalize(mul(v.normal,(float3x3)unity_WorldToObject));
           //相机的方向 视角到顶点的向量WorldSpaceViewDir(v.vertex) 顶点到视角的向量-WorldSpaceViewDir(v.vertex)
           float3 viewDir = -WorldSpaceViewDir(v.vertex);
           
           //求出折射refract 是API
           data.refract = refract(viewDir,localNormal,_EatRation);
           //计算反射系数
           data.reflectFact =  _FresnelBias+_FresnelScale*pow(1+dot(viewDir,localNormal),_FresnelPower);     
       }
        void surf (Input IN, inout SurfaceOutput o)
        {
            // Albedo comes from a texture tinted by color
            //反射从纹理中采样出来
            // fixed4 cflect = tex2D (_MainTex, IN.worldRefl);
            // fixed4 cfract = tex2D (_MainTex, IN.refract);
            fixed4 cflect = texCUBE (_SubTex, IN.worldRefl);
            fixed4 cfract = texCUBE (_SubTex, IN.refract);
            
            o.Albedo = IN.reflectFact * cflect.rgb+(1-IN.reflectFact)*cfract.rgb;
            
            o.Alpha = cflect.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}


http://www.kler.cn/a/411674.html

相关文章:

  • hive的存储格式
  • 【消息序列】详解(7):剖析回环模式--设备测试的核心利器
  • 不一样的css(三)
  • EXISTS 和 IN 的使用方法、特性及查询效率比较
  • Exploring Prompt Engineering: A Systematic Review with SWOT Analysis
  • IDEA配置本地maven
  • Bitcoin---Script Language;脚本类型
  • Python设计模式详解之15 ——迭代器模式
  • 异常检测 | 高斯分布拟合算法异常数据检测(Matlab)
  • JavaScript面向对象
  • <项目代码>YOLOv8 航拍行人识别<目标检测>
  • 准备学习boost::fiber库
  • RabbitMQ代码实战2
  • Leetcode322.零钱兑换(HOT100)
  • 训练的decoder模型文本长度不一致,一般设置为多大合适,需要覆盖最长的文本长度么
  • Spring集成RabbitMQ
  • 【spark-spring boot】学习笔记
  • IDEA某个Impl下的引入的文件红色
  • mp4视频流推送的学习
  • IDEA插件CamelCase,快速转变命名格式
  • 《硬件架构的艺术》笔记(八):消抖技术
  • css:转换
  • SQL优化笔记--explain看执行计划--主要还是看用了哪些索引,所以你是否失效--分库分表的注意事项(未完)
  • C#中面试的常见问题008
  • 列表代码思路
  • 前端技术选型之uniapp