Unity URP Shader 基础光照

news/2024/4/20 7:37:59/文章来源:https://blog.csdn.net/kingBook928/article/details/129253469

https://zhuanlan.zhihu.com/p/232193169https://www.jianshu.com/p/5641bfe91458

兰伯特(Lambert)定律
兰伯特定律是一种描述CG当中的经验性漫反射定律,它是这样说的。

漫反射光的强度近似地服从于Lambert定律,即漫反射光的光强仅与入射光的方向和反射点处表面法向夹角的余弦成正比。

这段话中可以拆分为几个点来看。
第一,近似的服从,也就是并不完全服从,主要说明它是一个经验模型。而非基于物理的渲染(PBR)
第二,入射光的方向,即我们需要入射光的角度,(当然还需要强度)
第三,反射点出的表面法线,我们需要顶点的法线
第四,与余弦成正比,我们需要计算入射光与顶点法线的余弦值,以计算光在该点的强度。

根据上面四个点,我们来简单梳理一下这个公式。首先,入射光的方向与反射点处的表面法线夹角的余弦成正比。我们就需要计算两个方向的余弦值,且不说这两个方向是什么,我们先看一下怎么计算两个方向的余弦值。

假设我们有A和B两个向量,我们可以得到以下关系。其中θ为A和B的夹角。\(\begin{aligned} \vec{A} \times \vec{B} & =|\vec{A}| \times|\vec{B}| \times \cos \theta \\ \frac{\vec{A} \times \vec{B}}{|\vec{A}| \times|\vec{B}|} & =\cos \theta \end{aligned}\)

这样,我们计算出了A向量和B向量的夹角值。

\(\cos \theta=A_{0} \times B_{0}\)
其中\(A_{0}、B_{0}\)表示\(A、B\)的单位向量

又由于,在夹角超过90°的地方,余弦值会变成负数,而这显然不符合光强度大于等于0的现实问题,所以我们给它加上一个限度。因而漫反射可以表示为下面这样。

\(\text { diffuse }=\max (0, L_{0} \times N_{0}) \times I\)
其中\(L_{0}\)为光照方向,而\(N_{0}\)为法线方向,\(I\)为光照强度。

函数 GetMainLight() 返回一个数据结构 Light

struct Light
{half3   direction; // 方向half3   color; // 颜色&强度half    distanceAttenuation; // 距离衰减half    shadowAttenuation; // 阴影衰减
};
Shader "Example/StandardLight" {Properties {_BaseColor("Base Color", Color)=(1, 1, 1, 1)}SubShader {Tags {"RenderType"="Opaque" "RenderPipeline"="UniversalPipeline"}Pass {HLSLPROGRAM#pragma vertex vert#pragma fragment frag#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Lighting.hlsl"CBUFFER_START(UnityPerMaterial)half4 _BaseColor;CBUFFER_ENDstruct Attributes{float4 positionOS : POSITION;half3 normal:NORMAL;};struct Varyings{float4 positionCS : SV_POSITION;half3 worldNormal:TEXCOORD0;};Varyings vert(Attributes input){Varyings output;// 从对象空间到裁剪空间output.positionCS = TransformObjectToHClip(input.positionOS.xyz);output.worldNormal = TransformObjectToWorldNormal(input.normal);return output;}half4 frag(Varyings input): SV_Target{Light mainLight = GetMainLight();// saturate(value) 相当于 Mathf.Clamp01(value) 函数,限制值在 [0,1] 区间float power = saturate(dot(mainLight.direction, input.worldNormal)); // 计算漫反射的强度half4 output = _BaseColor * power * half4(mainLight.color, 1); //将表面颜色,漫反射强度和光源强度混合。return output;}ENDHLSL}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MAML算法详解(元学习)

文章目录回顾元学习MAML算法MAML和预训练模型的区别数学推导MAML实施细节总结回顾元学习 元学习的基本知识参考这篇博客元学习和机器学习的对比 MAML算法 学习初始化参数,所有任务的初始化的参数都是一样的 MAML和预训练模型的区别 MAML使用的是ϕ\phiϕ…

阶段十:总结专题(第六章:缓存篇)

阶段十:总结专题(第六章:缓存篇)Day-第六章:缓存篇1. Redis 数据类型**String****List****Hash****Sorted Set**2. keys 命令问题3. 过期 key 的删除策略4. Redis 持久化**AOF 持久化****AOF 重写****RDB 持久化****混…

Python 中 openpyxl 模块封装,读写 Excel 文件中自动化测试用例数据

只有测试数据和错误提示信息不同,其他代码都是一样的,不这样不易修改数据和维护,会有两点痛点 1.代码冗余极其严重, 程序可读性不佳 2.程序拓展性很差 往往我们在自动化测试汇总,会将数据放在 Excel 文件、CSV文件、数据库 Py…

Python-scatter散点图及颜色大全

# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as pltplt.rcParams[font.sans-serif][SimHei] plt.rcParams[axes.unicode_minus] False #matplotlib画图中中文显示会有问题,需要这两行设置默认字体plt.xlabel(X) plt.ylabel(Y) plt.xlim…

【IP技术】ipv4和ipv6是什么?

IPv4和IPv6是两种互联网协议,用于在互联网上标识和寻址设备。IPv4(Internet Protocol version 4)是互联网协议的第四个版本,是当前广泛使用的互联网协议。IPv4地址由32位二进制数构成,通常表示为4个十进制数&#xff0…

大数据技术之Hive(四)分区表和分桶表、文件格式和压缩

一、分区表和分桶表1.1 分区表partitionhive中的分区就是把一张大表的数据按照业务需要分散的存储到多个目录,每个目录就称为该表的一个分区。在查询时通过where子句中的表达式选择式选择查询所需要的分区,这样的查询效率辉提高很多。1.1.1 分区表基本语…

2023年蜂巢科技最新面试题

2023年蜂巢科技最新面试题 bio与nio的区别 bio同步阻塞io:在此种⽅式下,⽤户进程在发起⼀个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,⽤户进程才能运⾏。JAVA传统的IO模型属于此种⽅式&#xff0…

flink常用算子介绍

flink任务中【Transformation 数据转换】是对数据进行操作,有 Map、FlatMap、Filter、KeyBy 、Reduce 、Fold 、Aggregations、Window 、WindowAll 、Union 、Window join 、Split 、Select 、Project 等,通过对数据的操作,转换成想要的数据&…

HttpRunnerManager部署

基于HttpRunner的接口自动化测试平台: HttpRunner, djcelery and Django_. HttpRunner手册: http://cn.httprunner.org/git地址:httprunner/HttpRunnerManager: 基于 HttpRunner 的 Web 测试平台,已停止维护。 (github.com)部署机器:linux部署…

vue3+rust个人博客建站日记4-Vditor搞定MarkDown

即然是个人博客,那么绝对不能丢给自己一个大大的输入框敷衍了事。如果真是这样,现在就可以宣布项目到此结束了。如今没人享受用输入框写博客。作为一个有追求的程序员,作品就要紧跟潮流。 后来,Markdown 的崛起逐步改变了大家的排…

华为OD机试题,用 Java 解【火星文计算 2】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

跑步戴哪种蓝牙耳机比较好,五款适合跑步的蓝牙耳机推荐

跑步当中佩戴的蓝牙耳机,佩戴舒适度以及牢固度是我们首要关注的,耳机的材质还有耳机的防水能力,都是十分需要注意的方面。那具体在挑选运动耳机当中需要如何选择呢?下面收集的一些在运动当中比较好用的运动蓝牙耳机分享给大家。1、…

华为OD机试题,用 Java 解【机器人走迷宫】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

力扣每日一题(2023年2月)

2023年2月期每日一题第一天 (2325. 解密消息)第十六天(2341. 数组能形成多少数对)第十七天 (1139. 最大的以 1 为边界的正方形)第十八天 (1237. 找出给定方程的正整数解)第十九天 &a…

【再临数据结构】Day1. 稀疏数组

前言 这不单单是稀疏数组的开始,也是我重学数据结构的开始。因此,在开始说稀疏数组的具体内容之前,我想先说一下作为一个有着十余年“学龄”的学生,所一直沿用的一个学习方法:3W法。我认为,只有掌握了正确的…

Apache Hive入门

文章目录一、Apache Hive概述1.1、什么是Hive1.2、使用Hive原因1.3、Hive和Hadoop关系二、Hive功能思想2.1、映射信息记录2.2、SQL语法解析、编译三、Hive架构、组件3.1、Hive架构图3.2Hive组件四、Hive常用操作4.1、数据类型4.1.1、基本数据类型4.1.2、集合数据类型4.2、数据库…

本地新项目上传到git的详细步骤

前提:你本地的项目目录里要记得添加.gitignore忽略文件,免得把一些无用的文件提交,内容如下,可直接粘贴: # Created by .ignore support plugin (hsz.mobi) ### Java template # Compiled class file *.class# Log fi…

2023-02-28 mmap的原理及使用-思考

摘要: 最近在使用mmap解决数据库内存占用损耗过高导致OOM的问题, 不得不说在有些场景下mmap是非常有用. 本文主要涉及一些对mmap的思考. mmap本身的思考: mmap和文件系统的交互规则是什么mmap中给进程虚拟内存映射的文件上的部分,是什么? 为什么是页缓存? 有没有文件缓存?…

华为OD机试题,用 Java 解【连续字母长度】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…

百度CTO王海峰:深度学习平台+大模型,夯实产业智能化基座

2月27日,中国人工智能学会首届智能融合产业论坛在成都顺利举办。本届论坛由中国人工智能学会(CAAI)主办,中国人工智能学会智能融合专委会、百度公司、深度学习技术及应用国家工程研究中心和电子科技大学联合承办。中国工程院多名院…