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

Unity图形学之BRDF双向反射分布函数

1.描述了入射光线在非透明物体表面如何进行反射,也就是说多少光发生了漫反射,多少光发生了镜面反射

BRDF 函数计算的是“特定反射方向的光强与入射光强的比例”

2.各向异性 与 均向性 相反,是指在不同方向具有不同行为的性质,也就是其行为与方向有关,如在物理上,沿着材料做不同方向的量测,若会出现不同行为,通常称该材料具有某种“各向异性”,这样的材料表面称为各向异性表面

3.分布函数:光在表面是怎么分布的

灯光的遮挡:

Shader "Custom/BRDF"
{
    Properties
    {
        _SpeColor ("SpecColor", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _SpecPower("SpecPower",float) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all  light types
        #pragma surface surf BRDFLighting
        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0
        sampler2D _MainTex;
        struct Input
        {
            float2 uv_MainTex;
        };
       
        fixed4 _SpeColor;
        float _SpecPower;
        #define PI 3.1415926
        half4 LightingBRDFLighting (SurfaceOutput s, half3 lightDir, half3 viewDir,  half   atten)
        {
            float3 H = normalize(lightDir+viewDir);
            float3 N = normalize(s.Normal);
            float d = (_SpecPower+2)*pow(dot(N,H),_SpecPower)/8.0;
            float f = _SpeColor + (1-_SpeColor)*pow(1-dot(H,N),5);
            float k = 2.0 /(sqrt(PI * (_SpecPower + 2)));
            float v = 1/((dot(N,lightDir)*(1-k)+k)*(dot(N,viewDir)*(1-k)+k));
            float all = d*f*v;
            float diff = dot(lightDir,N);
            float tmpResult = all+(1-all)*diff;
            half4 finalColor = 0;
            finalColor.rgb = tmpResult * s.Albedo * _LightColor0.rgb;
            finalColor.a = s.Alpha;
            return finalColor;
        }
        void surf (Input IN, inout SurfaceOutput o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
           
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}


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

相关文章:

  • MappingJackson2HttpMessageConverter
  • SpringBoot 架构助力夕阳红公寓管理系统可持续发展战略
  • 浅谈——深度学习和马尔可夫决策过程
  • uniapp定义new plus.nativeObj.View实现APP端全局弹窗
  • 【C/C++】内存管理详解:从new/delete到智能指针的全面解析
  • 【Code First】.NET开源 ORM 框架 SqlSugar 系列
  • 3.3 指针类型
  • telnet IP某个端口,但是ping不通IP :网络连接中的不同境遇
  • Redis(5):哨兵
  • 如何把产品3D模型放到网站上进行3D展示或3D互动?
  • 淘宝架构演化
  • 论文翻译 | BERTese: Learning to Speak to BERT
  • docker搭建socks5代理
  • ASUS/华硕天选5锐龙版 FA507U 原厂Win11-23H2系统 工厂文件 带ASUS Recovery恢复
  • k8s中pause镜像的作用
  • 计算机组成原理:程序计数器实验
  • uniapp组建scroll-view初始化页面设置scrollTop无效解决办法
  • 3.20MayBeAndroid
  • 二叉树知识
  • BurpSuite安装教程(详细!!附带下载链接)
  • C++算法练习-day50——538.把二叉树转换为累加树
  • 第7篇 寻找最大数___ARM C语言程序<三>
  • Elasticsearch与NLP的深度融合:文本嵌入与向量搜索实战指南
  • Linux:makefile的使用
  • DIY-Tomcat part 3 实现对动态资源的请求
  • 在shardingsphere执行存储过程