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

devtools/2024/11/27 23:52:54/

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/devtools/137517.html

相关文章

Lock锁和AQS之间的关系与区别:基于第一原理的深入分析

引言 在Java并发编程中,锁(Lock)和队列同步器(AbstractQueuedSynchronizer,简称AQS)是两个核心概念。它们为多线程环境下的同步和互斥提供了强大的支持。本文将从第一原理出发,深入探讨Lock锁和…

springboot配置https,并使用wss

学习链接 springboot如何将http转https SpringBoot配置HTTPS及开发调试 Tomcat8.5配置https和SpringBoot配置https 可借鉴的参考: springboot如何配置ssl支持httpsSpringBoot配置HTTPS及开发调试的操作方法springboot实现的https单向认证和双向认证(java生成证…

【Rust Iterator 之 fold,map,filter,for_each】

Rust Iterator 之 fold,map,filter,for_each 前言mapfor_each通过源码看for_each foldfilter总结 前言 在Iterator 一文中,我们提到过Iterator时惰性的,也就是当我们将容器转换成迭代器时不会产生任何的迭代行为,所以在使用时开发者还需要将…

Spring Boot与林业产品推荐系统的融合

2 系统开发技术 这部分内容主要介绍本系统使用的技术,包括使用的工具,编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今,已经超过25年了,依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

Code Review 指导方针

优质博文:IT-BLOG-CN Why Code Review? - 为什么要进行代码评审? Code Review是软件开发过程中的一个关键实践,它有以下几个重要目的: Improve Code Quality- 改进代码质量 【1】确保代码符合团队的编码标准、最佳实践和设计原则。 【2】识别并修正可…

Spring集成RabbitMQ

Spring集成RabbitMQ 官网&#xff1a;https://spring.io/projects/spring-amqp 创建聚合项目 父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3…

BERT简单理解;双向编码器优势

目录 BERT简单理解 一、BERT模型简单理解 二、BERT模型使用举例 三、BERT模型的优势 双向编码器优势 BERT简单理解 (Bidirectional Encoder Representations from Transformers)模型是一种预训练的自然语言处理(NLP)模型,由Google于2018年推出。以下是对BERT模型的简…

Java爬虫:数据采集的强大工具

引言 在信息爆炸的今天&#xff0c;数据已成为企业决策的重要依据。无论是市场趋势分析、用户行为研究还是竞争对手监控&#xff0c;都离不开对海量数据的收集和分析。Java作为一种成熟且功能强大的编程语言&#xff0c;其在数据采集领域——尤其是爬虫技术的应用——展现出了…