关于光照模型

news2024/7/6 19:33:15

关于光照模型

早期学习笔记,转载自早期Excel。

存在大量格式错误、可读性非常低,建议等待作者修复后阅读、或者作为查找性材料使用。

中文名英文名/缩写说明长什么样外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
兰伯特光照模型Lambert Lighting1.兰伯特反射(Lambert)是最常见的一种漫反射,经验模型 2.强度仅由L和N的乘积决定,也就是入射光方向和面法线的夹角,如果这个夹角越大、反射越弱,反之越强,现实生活中也是这个道理,很容易理解。 3.代码:FinalColor=saturate(dot(N,L)); *:saturate(x);//如果x取值小于0,则返回值为0。如果x取值大于1,则返回值为1。若x在0到1之间,则直接返回x的值。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
半兰伯特光照模型Half-Lambert Lighting1.Half-Lamber是Valve公司提出来的算法,其为了解决Lambert在背面太暗的问题。经验模型。 2.为什么兰伯特在背面会太暗?因为使用了saturate函数,在背面乘值小于0,取0,也就是漫反射强度为0,所以会暗。 3.FinalColor = pow(dot(N,L)*0.5+0.5,2); 4.解析一下公式,先看pow内部,就是把N和L的点乘得到的值从-11映射到01。这样可能会造成原先亮的地方不那么亮了,暗的地方又显得太亮了,也就是对比度变低了,于是再做个2次方,把暗的地方压一下,亮的地方虽然也是压的(因为都是小于1的值),但是没有暗的值压的厉害,相当于整体变暗一点,但是对比度更高。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
Phong光照模型Phong1.Phong模型用来模拟高光效果。 2. //Phong float3 R = reflect(-L,N); // float3 R = normalize( -L + 2* N* dot(N,L) ); float VR = saturate(dot(V,R)); float NL = saturate(dot(N,L)); float4 Specular = pow(VR,_SpecularPowerValue)*_SpecularScaleValue; float4 Diffuse = NL; FinalColor = Specular + Diffuse; 3.看一下公式,主要是计算高光Specular的部分,它受到视角和反射光线方向的影响,视角和反射光线夹角越小,高光就越强。 4.reflect(-L,N);函数用来计算入射光线以法线为N的表面反射后的出射光线。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
Blin-Phong光照模型Blin-Phong Lighting1.也是用来模拟高光的经验模型。 2. //Blin-Phong float3 H = normalize(V+L); float NH = saturate(dot(N,H)); float NL = saturate(dot(N,L)); float4 Specular = pow(NH,_SpecularPowerValue)*_SpecularScaleValue; float4 Diffuse = NL; FinalColor = Specular + Diffuse; 3.H是半程向量,也叫半角向量,是视角方向和入射光方向的中线,Blin-Phong的高光强度由半程向量和面法线的夹角决定,夹角越小,高光越强。 4.和Phong对比,不用计算反射光线方向,性能较好。和Phong相比,高光会大一些、圆滑一些。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
环绕光照/包裹光照Wrap Lighting1.可以处理物体明暗交界处的颜色 2. float NL = dot(N,L); float NH = dot(N,H); float NLWrap = (NL + _Wrap)/(1 + _Wrap); //add color tint at transition from light to dark //在从明到暗的转换中添加颜色色调 float scatter = smoothstep(0,_ScatterWidth,NLWrap) * smoothstep(_ScatterWidth2,_ScatterWidth,NLWrap); float specular = pow(saturate(NH),_Shininess); float3 diffuse = max(NLWrap,0) + scatter _ScatterColor; FinalColor.rgb = diffuse + specular; 3.NLWrap有点像之前的半兰伯特,把diffuse映射到不那么暗的地方,这里的scatter用来计算“边缘程度”,值越大、也代表越接近明暗交界处。 *:smoothstep(a, b, x); // x<a<b 或 x>a>b 返回0 ,x<b< a 或 x>b>a 返回1 smoothstep与lerp类似,返回 0 和 1 之间平滑的 Hermite 插值。 *:lerp(a,b,w); //(a,b,w)当w为0时返回a,为1时返回b,当w在0-1之间时,比重w将ab进行线性插值,外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
高洛德着色Gouraud Lighting1.简单来说Gouraud就是在VertexShader而不是在FragmentShader中计算光照的Phong模型。在顶点中计算光照后,再在Fragment中插值。 2.节省性能,但是效果很差。高光和漫反射计算棱角分明,面对较圆滑的模型表现尤其差。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
带状照明/分段着色Banded Lighting1.就是把漫反射分段,之前说的漫反射是平滑过度的,现在把它们隐射到不同的级数里,像条形统计图那样。可以用作卡通渲染。 2. //Banded Lighting float NL = (dot(N,L))0.5+0.5; // float _BandedStep = 6; float BandedNL = floor(NL_BandedStep)/_BandedStep; float4 C1 = lerp(_ColorA,_ColorB,BandedNL); float4 C2 = lerp(_ColorB,_ColorC,BandedNL); float4 Diffuse = lerp(C1,C2,BandedNL); // float4 Diffuse = smoothstep(_ColorA,_ColorB,BandedNL); FinalColor = Diffuse; 3.这里先用NL记录了半兰伯特计算出来的值,再把它映射到BandedNL里。此案例给了三个用来分段的颜色,先用BandedNL插值出AB间,再插BC间,再插这两个结果之间。如果只是两个颜色间分段,只需要一次插值。 *:floor(a)//向下取整外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
月光模型Minnaert Lighting1.Minnaert光照主要是用来模拟月球光照的,其特点是:光照不到的地方一定是全黑的、面法线与视线的夹角越大、看上去也越暗。 2. //Minnaert Lighting float NL = saturate(dot(N,L)); float NV = saturate(dot(N,V)); // float _Roughness = 0.5; float4 Minnaert = saturate(pow(NL*NV,_Roughness)*NV); FinalColor = Minnaert; //公式:Minnaert = (((N.*L)(N.*V))^(_Rough)) * (N.*V)外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
粗糙度光照(自己起的)Oren-Nayar Lighting1.此模型用来描述光在粗糙表面的反射情况,相比于Lambert模型,它考虑了 粗糙度参数,常用来模拟比较粗糙的表面。 2. //Oren-Nayer //粗糙度参数由噪声图采样获得 float roughness = tex2D(_RoughnessTex,i.uv).r _Roughness; float NL = saturate(dot(N,L)); float NV = saturate(dot(N,V)); float theta2 = roughnessroughness; //A + B约等于1.右边有函数图上A下B float A = 1 - 0.5*(theta2/(theta2 +0.33)); float B = 0.45 (theta2/(theta2+0.09)); //反余弦得夹角 float acosNV = acos(NV); float acosNL = acos(NL); //alpha是法线与视线的夹角、法线与光照方向的夹角之间更大的那一个 float alpha = max(acosNV,acosNL); //beta是法线与视线的夹角、法线与光照方向的夹角之间更小的那一个 float beta = min(acosNV,acosNL); //V - NNV 是个综合了N、V二者夹角经过复杂变换后得到的值,目前无法理解 float gamma = length(V - NNV) * length(L - NNL); float Diffuse = 1; //最终综合以下影响:环境光、漫反射、粗糙度的复杂计算 float OrenNayer = Diffuse * NL (A+ Bmax(0,gamma)*sin(alpha)*tan(beta)); FinalColor = OrenNayer; //最终效果是:粗糙度越大、约暗,反射的光越弱,但和视角也有一定关系。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 这是加了粗糙度贴图的效果外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
背光/次表面散射(方法之一)(SSS)BackLight1.真实的光照几乎都包含反射、透射和次表面散射这三种,前两种以前就了解过,次表面散射的定义是:入射光和出射光在表面的同一侧,但入射点和反射点并不在同一个点。因为光线会打入表面内部,在与内部的原子碰撞若干次后反射出来。像玉石等物件,在背光时、边缘或者薄处比较亮,这种效果就可以用此表面散射来模拟。 2. //WrapLight计算漫反射 float WrapLight = pow(dot(N,L)_WrapValue+(1-_WrapValue),2); //Blin-Phong计算高光 float3 R = reflect(-L,N); float3 H = normalize(V+L); float VR = saturate(dot(V,R)); float NH = saturate(dot(N,H)); float NL = saturate(dot(N,L)); float4 Specular = pow(NH,_SpecularPowerValue)_SpecularScaleValue; float4 Diffuse = WrapLight; //模拟透射现象 float _SSSValue =0.6; //当SSSValue = 0,这个Shift就是光照方向的反方向,这里计算的是片元法线的偏移值 //这里的思想是用一个变量储存模拟的片元法线变换后的方向,再拿这个方向去计算 float3 N_Shift = -normalize(N*_SSSValue+L);//沿着光线方向上偏移法线,最后在取反 //这里是再用视线方向与偏移后的模拟法线方向计算一次背光强度,视线方向越接近模拟后偏移方向,背光强度越强 float BackLight = saturate(pow(saturate( dot(N_Shift,V)) ,_PowerValue)*_ScaleValue); FinalColor =Diffuse + Specular + BackLight; *:简单的来说,就是多计算一个背光项,其亮度由NV来计算,但是这个N是处理过的V,是法线往入射光方向偏移一定程度后再取反的法线。 3.对于光照能直接照到的地方,背光应该是不起效的,因为把法线偏向光源后,它与视角的夹角一般会变大,大于90度后值就会小于0了。 4.如果是光照的背面,则是面法线方向与光照方向越接近,背光越亮。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 这里是背面
各向异性光照模型Anisotropic Lighting1.用来模拟光照下的头发、带状的高光,在各个方向表现不一致的材质。 2. //shift值通过对纹理采样获得,为了使头发高光有上下偏移 float shift = tex2D(_StretchedNoiseTex,i.uv4).r + _ShiftTangent; //用一个变量储存向法线偏移一定值后的切线,偏移多少由shift决定 float3 T_Shift = normalize( T+ Nshift); //半程向量 float3 H = normalize(V+L); //把偏移后切线当成原先Phong模型的面法线,用来和半程向量计算高光的强度 float dotTH = dot(T_Shift,H); //定义高光段数 float NumberOfStrip =1; //通过拉伸一下Cos的X轴模拟多段高光 float cosTH =cos(dot(T_Shift,H)NumberOfStrip ); //高光强度映射到0~1 float dirAtten = smoothstep(-1,0,dotTH); //计算高光,dirAtten是仅由物体决定的总体的高光强度,与原先基本没有区别,cosTH段是通过采样值做多段处理 float Specular = dirAtten * pow(cosTH,_AnisotropicPowerValue)_AnisotropicPowerScale; float WrapLight = dot(N,L)0.5+0.5; float Diffuse = WrapLight; FinalColor = Diffusefloat4(0.7,0.2,0.4,0) +Specular; return FinalColor; *:简单的来说,做法就是在计算高光的时候,把原先的法线用“向法线偏移一定程度后的切线”代替。一想、确实,这样原先是高光的地方就因为偏移变得不是高光了,而总有一圈其他地方的会因为切线偏移后刚好和半程向量比较近,就会出现高光。外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 这里是加了贴图的效果
*:上面加灰了的这种说法是片面的,我自己复刻的时候遇到了很大的问题。首先、上面的T_Shift的确是向法线偏移后的切线,但是这不会导致带状高光,而是会导致高光位置偏移、形状扭曲!对于次表面散射的物体,的确需要高光偏移位置合扭曲。真正导致带状高光产生的,是CosTH那一项。想象一下,原来整个表面的高光强度被映射到01,此时在cosTH计算的时候,先把高光强度乘以一个指定值,也就是把高光强度映射到0若干,此时超过3.14的部分变成小于0,导致高光强度变为小于0,也就表现为非高光。总之带状高光的根本在于Cos函数映射,而高光的扭曲和位移才取决于向法线偏移的切线。 *:SmoothStep项作者应该也写错了,应该clamp 0~1 而不是 -1~0,我试了,clamp -1 ~ 0将导致全面变白。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1686347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VUE3-form表单保存附件与基本信息

element-ui代码 <el-dialog :title"上传附件" v-model"dialogAdds.visible" width"500px" append-to-body> <el-form-item label"唯一标识"> <dict-tag v-if"form.groupId" :options"unique_identifica…

倍福CX7000PLC PWM/PTO输出功能块编程应用

如果大家是第一次用倍福的控制器和PLC,建议大家看看下面的文章链接: 从零开始倍福TwinCAT 3 PLC 的一个简单项目-CSDN博客https://rxxw-control.blog.csdn.net/article/details/139124427倍福TwinCAT3软件下载安装 倍福TwinCAT3 PLC编程软件下载安装-CSDN博客

设计模式——职责链(责任链)模式

目录 职责链模式 小俱求实习 结构图 实例 职责链模式优点 职责链模式缺点 使用场景 1.springmvc流程 ​2.mybatis的执行流程 3.spring的过滤器和拦截器 职责链模式 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成…

怎么清理C盘空间?5个清理方法要掌握好!

“我的电脑太满了&#xff0c;想清理一下电脑&#xff0c;但是根本不知道怎么操作&#xff0c;有什么方法可以快速清理c盘空间吗&#xff1f;希望大家给我出出主意&#xff01;” 随着电脑使用时间的增长&#xff0c;C盘&#xff08;通常是系统盘&#xff09;的空间会逐渐被占用…

Web开发——HTMLCSS

1、概述 Web开发分前端开发和后端开发&#xff0c;前端开发负责展示数据&#xff0c;后端开发负责处理数据。 HTML&CSS是浏览器数据展示相关的内容。 1&#xff09;网页的组成部分 文字、图片、音频、视频、超链接、表格等等 2&#xff09;网页背后的本质 程序员写的前端…

如何确定SolidWorks文件是哪个版本的软件创建

由于 SolidWorks 低版本无法打开高版本的文件&#xff0c;我们有时候从网络上下载一些模型时可能现当前的 SolidWorks 版本无法打开模型的问题&#xff0c;这时候具需要确定模型究竟是哪个版本的以便于我们安装相应的版本或高版本的 SolidWorks。 那么我们就需要方法确定如何查…

Autodl服务器中Faster-rcnn(jwyang)训练自己数据集(二)

前言 上一章中完成了faster-rcnn(jwyang版本)的复现&#xff0c;本节将在此基础进一步训练自己的数据集~ 项目地址&#xff1a;https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 复现环境&#xff1a;autodl服务器python3.6cuda11.3Ubuntu20.04Pytorch1.10.0…

Android应用URI调起百度地图、高德地图 和 腾讯地图

1、百度地图 地图调起API | 百度地图API SDKhttps://lbs.baidu.com/faq/api?titlewebapi/uri/andriod例&#xff1a;反向地址解析 //反向地址解析URI private final String BAIDU_MAP_NAVI_URI "baidumap://map/geocoder?location";/*** 跳转百度地图*/ private…

基于.NetCore和ABP.VNext的项目实战二:Swagger

Mag.Blog.Swagger层添加Volo.Abp.AspNetCore和Swashbuckle.AspNetCore包,引用实体层.Domain 添加模块类MagBlogSwaggerModule.cs,依赖MagBlogDomainModule模块,并且重写ConfigureServices和OnApplicationInitialization方法 namespace Mag.Blog.Swagger {[DependsOn(typeof…

LeetCode刷题之HOT100之找到数组中消失的数字

2024/5/24 今天早上没有下雨&#xff0c;太好了。下周就要搬到二楼会议室开发了&#xff0c;很多计划都要被打破了。事已至此&#xff0c;先做题吧! 2、逻辑分析 题目的要求是&#xff1a;给定一个长度为n的整数数组nums&#xff0c;要输出在[1&#xff0c;n]范围内但没有出现…

Docker 开启 SSL 验证

最近看 OJ 项目的远程开发阶段&#xff0c;然后踩坑踩了 2 天&#x1f602; Docker 版本&#xff1a;在 CentOS 安装 sudo yum install docker-ce-20.10.9 docker-ce-cli-20.10.9 containerd.io Client: Docker Engine - CommunityVersion: 20.10.9API version: …

本机与华为云ping不通的问题

进入华为云控制台。依次选择&#xff1a;云服务器->点击服务器id->安全组->更改安全组->添加入方向规则&#xff0c;添加一个安全组规则&#xff08;ICMP&#xff09;&#xff0c;详见下图 再次ping公网ip就可以ping通了 产生这一问题的原因是ping的协议基于ICMP…

浏览器输入URL到网页显示之间发生了什么

记&#xff1a; DNS(Domain Name System,域名系统)就是根据域名来查找对应的IP地址的一个关键系统。 域名层级关系&#xff1a; 根域名服务器&#xff08;.&#xff09;顶级域名服务器&#xff08;.com&#xff09;权威域名服务器&#xff08;server.com&#xff09; 首先浏…

超简单白话文机器学习-朴素贝叶斯算法(含算法讲解,公式全解,手写代码实现,调包实现

1. 朴素贝叶斯算法 朴素贝叶斯&#xff08;Naive Bayes&#xff09;算法是一类基于贝叶斯定理的简单而强大的概率分类器&#xff0c;它在假设特征之间相互独立的前提下工作。尽管这种“朴素”的假设在现实中很少成立&#xff0c;但朴素贝叶斯分类器在许多实际应用中表现良好&am…

灌区信息化管理系统助力灌区节水,打造绿色生态新农业

在现代化农业发展的浪潮中&#xff0c;如何实现节水、高效、绿色的农业生产成为了人们关注的焦点。智慧灌区信息化系统应运而生&#xff0c;以其独特的技术优势&#xff0c;助力灌区节水&#xff0c;打造绿色生态新农业&#xff0c;引领农业生产的未来。 灌区信息化管理系统&am…

高中数学:平面向量-题型总结及解题思路梳理

一、知识点及解题思路梳理 高中&#xff0c;2/3的向量题目是坐标向量题&#xff0c;1/3是几何向量题。但是&#xff0c;这1/3的几何向量题可以转换成坐标向量题。 二、练习 例题1 几何型向量题 例题2

LabVIEW波纹补偿器无线监测系统

LabVIEW波纹补偿器无线监测系统 在石油化工、冶金及电力等行业中&#xff0c;波纹补偿器作为一种重要的补偿性元件&#xff0c;其安全稳定的运行对管道输送系统的可靠性至关重要。开发了一种基于LabVIEW的波纹补偿器无线监测系统&#xff0c;通过实时监测波纹补偿器的工作状态…

Kubernetes的灵魂核心:kube-scheduler

Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。在Kubernetes集群中&#xff0c;kube-scheduler是一个至关重要的组件&#xff0c;它负责将Pod&#xff08;Kubernetes中的最小部署单元&#xff0…

Dom树和渲染树的细微差别,你能分清吗?

DOM树和渲染树都是浏览器渲染页面时生成的树形结构&#xff0c;但它们有一些区别。 1. DOM树&#xff1a; DOM树是由HTML解析器解析HTML文档生成的&#xff0c;它是文档的结构化表示&#xff0c;包含了HTML文档中的所有元素节点、文本节点、注释节点等&#xff0c;它是一个包…

“AI+综合节能改造”:打造数据中心热管理系统节能“秘籍”

维谛技术服务&#xff1a; 欧小明 曲鑫 当前&#xff0c;基于AI技术在确保精准制冷、实现节能和提升运营效率方面的重要作用&#xff0c;将AI技术与热管理系统改造相结合&#xff0c;实现深度协同&#xff0c;是数据中心节能改造的关键路径之一。 “AI综合节能改造”提升热管…