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

ops/2024/11/28 22:01:07/

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 200CGPROGRAM// 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.0sampler2D _MainTex;struct Input{float2 uv_MainTex;};fixed4 _SpeColor;float _SpecPower;#define PI 3.1415926half4 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 colorfixed4 c = tex2D (_MainTex, IN.uv_MainTex);o.Albedo = c.rgb;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}


http://www.ppmy.cn/ops/137484.html

相关文章

小程序-基于java+SpringBoot+Vue的网上花店微信小程序设计与实现

项目运行 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Leetcode(双指针习题思路总结,持续更新。。。)

讲解题目:两数之和 给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满…

各种排序算法

前置知识 排序: 按照递增或者递减的顺序把数据排列好 稳定性: 值相等的元素在排序之后前后顺序是否发生了改变 内部排序: 数据放在内存上 外部排序: 数据放在磁盘上 内部排序 基于比较的排序 几大排序算法 1. 堆排序 特点: 思想: 1. 创建大根堆,把所有元素放在大根堆里…

Git旧文件覆盖引发思考

一天,我的同事过来找到我,和我讲:张叫兽,大事不好,我的文件被人覆盖了。git是真的不好用啊 git不好用?文件被覆盖;瞬间我似乎知道了什么,让我想到了某位男明星的语法:他…

C语言中使用动态内存

在前面介绍C语言的内存模型时知道C语言中将内存划分为多个区间:栈区、堆区、静态区、常量区、代码区。在方法内定义和使用的变量,如果没有使用static关键字修饰都是在栈区内,该区内定义的变量不需要我们管理,系统会自动申请和释放…

【设计模式】1. 构建器模式(Builder Pattern)是一种创建型设计模式

构建器模式(Builder Pattern)是一种创建型设计模式,用于分步骤构建复杂对象,同时允许按照不同的需求生成不同的表示。该模式将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的对象。 核心思想 构建器模…

Go 中的并发 Map:深入探索 sync.Map 及其他实现方法

在 Go 语言的并发编程世界中,数据共享和同步是永恒的话题。map 是 Go 语言中常用的数据结构,但在多 goroutine 环境中直接使用它并不是线程安全的。因此,我们需要采用特定的策略来确保并发访问的安全性。本文将深入探讨 Go 中的并发 Map&…

Android 设备使用 Wireshark 工具进行网络抓包

背景 电脑和手机连接同一网络,想使用wireshark抓包工具抓取Android手机网络日志,有以下两种连接方法: Wi-Fi 网络抓包。USB 网络共享抓包。需要USB 数据线将手机连接到电脑,并在开发者模式中启用 USB 网络共享。 查看设备连接信…