第八天 开始Unity Shader的学习之Blinn-Phong光照模型

Unity Shader的学习笔记

第八天 开始Unity Shader的学习之Blinn-Phong光照模型


文章目录

  • Unity Shader的学习笔记
  • 前言
  • 一、Blinn-Phong光照模型
      • ①计算高光反射部分
      • 效果展示
  • 二、召唤神龙:使用Unity内置的函数
  • 总结


前言

今天我们编写另一种高光反射的实现方法 – Blinn光照模型.同时了解一些Unity的内置函数.


提示:以下是本篇文章正文内容,下面案例可供参考

一、Blinn-Phong光照模型

Blinn模型没有使用反射方向,而是引入了新的矢量h,它是通过对视角方向v和光照方向l相加后在归一化得到的.公式如下:
Blinn模型的h变量计算方法
Blinn模型计算高光反射的公式如下:
Blinn高光反射的公式
代码如下:

Shader "Unity Shaders Book/Chapter 6/Blinn Phong"{Properties{_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)_Specular ("Specular", Color) = (1, 1, 1, 1)//_Gloss用于控制高光反射属性_Gloss ("Gloss", Range(8.0, 256)) = 20}SubShader{Pass{Tags {"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Diffuse;fixed4 _Specular;float _Gloss;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;float3 worldPos : TEXCOORD1;};v2f vert(a2v v){v2f o;o.pos = UnityObjectToClipPos(v.vertex);//o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);  下面的代码和上面的是一个作用o.worldNormal = UnityObjectToWorldNormal(v.normal);o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;return o;}fixed4 frag(v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 worldNormal = normalize(i.worldNormal);//fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);  下面的代码和上面的是一个作用fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLightDir));fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.worldPos.xyz);fixed3 halfDir = normalize(viewDir + worldLightDir);fixed3 specular = _LightColor0.rgb * _Specular.rgb * pow(saturate(dot(i.worldNormal, halfDir)), _Gloss);return fixed4(ambient + diffuse + specular, 1.0);}ENDCG}}Fallback "Specular"
}

①计算高光反射部分

首先我们还是计算出视角方向,然后再对视角方向和光照方向相加之后再归一化得到的,最后再计算高光部分即可.

效果展示

Blinn-Phong模型演示
可以从效果图看出来,Blinn-Phong光照模型的高光反射部分看起来更大,更亮一点,在实际渲染中,绝大多数我们都会选择Blinn-Phong光照模型,但是这两种光照模型都是经验模型,换句话说,我们不应该认为Bliin_phong模型是对"正确的"Phong模型的近似,实际上,Blinn-Phong模型更符合实验结果.

二、召唤神龙:使用Unity内置的函数

我们在之前的Shader代码中,很多东西都是我们手动计算的,例如视角方向,光源方向等(虽然我们使用的_WorldSpaceLightPos0.xyz得到的光源方向只适合平行光,如果有更复杂的光源信息,这种方法就是错误的了),但是手动计算的过程比较麻烦,Unity提供一些内置函数来帮助我们计算这些信息.

函数名描述
float3 WorldSpaceViewDir(float4 v)输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向,内部实现使用了UnityWorldSpaceViewDir函数
float3 UnityWorldSpaceViewDir(float4 v)输入一个世界空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
float3 ObjectSpaceViewDir(float4 v)输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
float3 WorldSpaceLightDir (float4 v)仅可用于前向渲染中,输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,内部使用了UnityWorldSpaceLightDir 函数,没有被归一化
UnityWorldSpaceLightDir (float4 v)仅可用于前向渲染中,输入一个世界空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化
float3 ObjSpaceLightDir(float4 v)仅可用于前向渲染中,输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向,没有被归一化
float3 UnityObjectToWorldNormal(float3 norm)把法线方向从模型空间转换到世界空间中
float3 UnityObjectToWorldDir(float3 dir)把方向矢量从模型空间变换到世界空间中
float3 UnityWorldToObjectDir(float3 dir)把方向矢量从世界空间变换到模型空间中

类似于UnityXXXX的几个函数都是Unity5中新添加的内置函数,这些帮助函数使得我们不需要跟各种变换矩阵,内置变量打交道,也不需要考虑使用了哪种光源这种问题,而仅仅调用一个函数就可以得到需要的信息.
上面的9个帮助函数中,我们已经掌握了五个器内部实现,都在我们之前的代码中找到,但是需要注意的是,这些函数没有保证得到的方向矢量都是单位矢量,因此我们使用之前都需要将他们归一化.


总结

今天的内容就这么多,我们也可以进行一些尝试,将之前的计算使用这些函数代替一下.

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

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

相关文章

React八案例上

代码下载 技术栈: React 核心库:react、react-dom、react-router-dom脚手架:create-react-app数据请求:axiosUI组件库: antd-mobile其他组件库: react-virtualized、formikyup、react-spring 等百度地图A…

线代[13]|线性代数题37道以及数学分析题3道(多图预警)

博主首次发布于CSDN,禁止转载!(CSDN:汉密士2025) 文章目录 一、缘起|《俗说矩阵》课程目录照片存档|线性代数学习脉络|线代习题集封面存档|未来——我与线性代数的纠缠 二…

OpenCV 图形API(24)图像滤波-----双边滤波函数bilateralFilter()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 应用双边滤波到图像。 该函数对输入图像应用双边滤波,如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Fil…

AI与5G的融合:如何实现更快速、更智能的物联网应用?

引言 AI和5G的结合,正在加速物联网(IoT)应用的发展,让万物互联变得更加智能、高效。5G提供超高速率、低时延和海量连接的网络能力,而AI则赋予物联网设备更强的数据分析、预测和自动决策能力。当AI与5G融合,…

在ArcGIS Pro中将栅格NoData值修改为特定值

目录 问题如下:栅格文件中NoData值为65535,要将该NoData值修改为-9999 步骤一:使用栅格计算器(Raster Calculator)输出具有新NoData值的栅格文件 步骤二:输出修改值后的栅格文件(Export Rast…

蓝牙连接hci 命令和事件的交互

参考:在HCI层看蓝牙的连接过程_hci 获取蓝牙pin码-CSDN博客 我这边查看的是core 5.2 一、数据交互流程 1、ACL连接建立后的可选流程 参考蓝牙core5.2: vol2 --> PartF --> 4 1.1 AUTHENTICATION REQUESTED Authentication can be explicitly executed at …

【计算机网络实践】(十二)大学校园网综合项目设计

本系列包含: (一)以太网帧分析与网际互联协议报文结构分析 (二)地址解析协议分析与传输控制协议特性分析 (三)交换机的基本操作、配置、 虚拟局域网配置和应用 (四)交…

制造企业数据治理体系搭建与业务赋能实践

当下制造企业正面临着前所未有的机遇与挑战,从多环节业务协同的复杂性,到海量数据资源的沉睡与孤岛化;从个性化定制需求的爆发,到供应链效率优化的迫切性——如何通过数据治理将“数据包袱”转化为“数据资产”,已成为…

python高级编程一(生成器与高级编程)

@TOC 生成器 生成器使用 通过列表⽣成式,我们可以直接创建⼀个列表。但是,受到内存限制,列表容量肯定是有限的。⽽且,创建⼀个包含100万个元素的列表,不仅占⽤很⼤的存储空间,如果我们仅仅需要访问前⾯⼏个元素,那后⾯绝⼤多数元素占 ⽤的空间都⽩⽩浪费了。所以,如果…

智能指针之设计模式2

前面介绍了工厂模式控制了智能指针和资源对象的创建过程,现在介绍一下智能指针是如何利用代理模式来实现“类指针(like-pointer)”的功能,并控制资源对象的销毁过程的。 2、代理模式 代理模式是为其它对象提供一种代理以控制对这…

探索R语言:在线学习资源汇总

一、收集关于特定R主题的问题和答案(Q&A) 1. Stack overflow Empowering the world to develop technology through collective knowledge – Stack Overflowhttps://stackoverflow.co/ 二、Rstudio工具栏help Rstudio中有个Cheat sheet&#xf…

《C语言中以数组作为参数的探讨》

🚀个人主页:BabyZZの秘密日记 📖收入专栏:C语言 🌍文章目入 一、数组作为参数的传递机制二、数组参数的声明方式(一)省略数组大小(二)指定数组大小(三&#x…

深入解析区块链技术:原理、应用与未来展望

1 区块链技术原理 1.1 基本概念 区块链本质上是一个分布式账本,它由一系列按照时间顺序排列的数据块组成,每个数据块包含了一定时间内的交易信息。这些数据块通过密码学技术相互链接,形成一个不可篡改的链条。其核心特点包括去中心化、不可篡…

selenium快速入门

一、操作浏览器 from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By# 设置选项 q1 Options() q1.add_argument("--no-sandbo…

面试如何应用大模型

在面试中,如果被问及如何应用大模型,尤其是面向政务、国有企业或大型传统企业的数字化转型场景,你可以从以下几个角度进行思考和回答: 1. 确定应用大模型的目标与痛点 首先,明确应用大模型的业务目标,并结合企业的实际需求分析可能面临的痛点。这些企业通常会关注如何提…

嵌入式常见概念的介绍

目录 一、MCU、MPU、ARM (一)MCU(微控制器) (二)MPU(微处理器) (三)ARM(架构) 二、DSP (一)数字信号处理…

深度强化学习(DRL)框架与多目标调度优化详解

深度强化学习(DRL)框架与多目标调度优化详解 (截至2025年4月,结合最新研究进展) 一、DRL主流框架及核心算法 通用DRL框架 Ray RLlib:支持分布式训练,集成PPO、A3C、DQN等算法,适用于…

centos 安装python3.9.9

这里写自定义目录标题 安装编译依赖 sudo yum -y groupinstall "Development Tools" sudo yum -y install openssl-devel bzip2-devel libffi-devel wget zlib-devel yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel …

【动态规划】深入动态规划:背包问题

文章目录 前言01背包例题一、01背包二、分割等和子集三、目标和四、最后一块石头的重量|| 完全背包例题一、完全背包二、 零钱兑换三、零钱兑换||四、完全平方数 前言 什么是背包问题,怎么解决算法中的背包问题呢? 背包问题 (Knapsack problem) 是⼀种组…

Vue 接口请求 Nginx配置实时压缩 速度起飞

生效之前 nginx配置如下 gzip on; gzip_min_length 1k; gzip_buffers 16 256k; gzip_http_version 1.1; gzip_comp_level 6; gzip_types application/json application/javascript text/javascript text/css text/plain; gzip_vary on; 生效之后 #user…