UnitySahder实现Phong/BlinnPhong模型

目录

Phong模型公式:

BlinnPhong模型公式:

实现:

Phong模型:

BlinnPhong模型:


Phong模型公式:

结果=自发光+环境光+漫反射+高光反射

BlinnPhong模型公式:

对Phong模型的简单修改,修改部分在于高光反射部分,其公式为:

c_{specular}=\left ( c_{light}\cdot m_{specular} \right )max\left ( 0,\widehat{n}\cdot \widehat{h} \right )^{m_{gloss}}

其中n为表面法线,h为视角方向和光照方向相加后归一化所得,也叫做半角方向。

实现:

Phong模型:

Shader "MyShader/Phong"
{Properties{_DiffuseColor("漫反射颜色",color)=(1,1,1,1)_SpecularColor("高光颜色",color)=(1,1,1,1)_Gloss("高光范围",Range(0,256))=30[Toggle]_halfLambert("开启半兰伯特",int)=0}SubShader{Pass{Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert #pragma fragment frag #include "UnityCg.cginc"#include "Lighting.cginc"float _Gloss;float4 _SpecularColor;float4  _DiffuseColor;bool _halfLambert;struct vertexInput {float4 vertex:POSITION;float3 normal:NORMAL;};struct vertexOutput{float4 pos:SV_POSITION;fixed3 worldNormal:TEXCOORD0;float3 worldPos:TEXCOORD2;};vertexOutput vert(vertexInput v){vertexOutput o=(vertexOutput)0;o.pos=UnityObjectToClipPos(v.vertex);o.worldNormal=UnityObjectToWorldNormal(v.normal);o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;return o;}float4 frag(vertexOutput i):SV_TARGET{fixed3 worldNormal=normalize(i.worldNormal);fixed3 worldLightDir=normalize(_WorldSpaceLightPos0.xyz);float lambert=saturate(dot(worldLightDir,worldNormal));float halflambert=dot(worldLightDir,worldNormal)*0.5+0.5;fixed3 viewDir=normalize(_WorldSpaceCameraPos.xyz-i.worldPos);fixed3 reflectDir=normalize(reflect(-worldLightDir,worldNormal));fixed3 ambient=UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuseTemp=_DiffuseColor.rgb*_LightColor0.rgb;fixed3 specular=_SpecularColor.rgb*_LightColor0.rgb*pow(saturate(dot(viewDir,reflectDir)),_Gloss);if(_halfLambert)return float4(diffuseTemp*halflambert+specular+ambient,1.0);elsereturn float4(diffuseTemp*lambert+specular+ambient,1.0);}ENDCG}}
}

BlinnPhong模型:

Shader "MyShader/BlinnPhong"
{Properties{_DiffuseColor("漫反射颜色",color)=(1,1,1,1)_SpecluarColor("高光反射颜色",color)=(1,1,1,1)_Gloss("高光反射范围",Range(0,256))=30[Toggle]_halfLambert("开启半兰伯特",float)=0}SubShader{Pass{Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert #pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"fixed4 _DiffuseColor;fixed4 _SpecluarColor;float _Gloss;bool _halfLambert;struct vertexInput{float4 vertex:POSITION;fixed3 normal:NORMAL;};struct vertexOutput{float4 pos:SV_POSITION;fixed3 worldNormal:TEXCOORD0;fixed3 worldPos:TEXCOORD1;};vertexOutput vert(vertexInput v){vertexOutput o=(vertexOutput)0;o.pos=UnityObjectToClipPos(v.vertex);o.worldNormal=UnityObjectToWorldNormal(v.normal);o.worldPos=mul(unity_ObjectToWorld,v.vertex).xyz;return o;}float4 frag(vertexOutput i):SV_TARGET{fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz-i.worldPos.xyz);fixed3 hDir=normalize(worldLightDir+viewDir);float lambert=saturate(dot(worldLightDir,worldNormal));float halflambert=dot(worldLightDir,worldNormal)*0.5+0.5;fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT;fixed3 specular = _SpecluarColor.rgb*_LightColor0.rgb*pow(saturate(dot(worldNormal,hDir)),_Gloss);fixed3 diffuseTemp = _DiffuseColor.rgb*_LightColor0.rgb;if(_halfLambert)return float4(diffuseTemp*halflambert+ambient+specular,1.0);elsereturn float4(diffuseTemp*lambert+ambient+specular,1.0);}ENDCG}}
}

效果:

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

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

相关文章

Git―基本操作

Git ⛅认识 Git⛅安装 GitCentos(7.6)Ubuntu ⛅Git―基本操作创建本地仓库🍂配置本地仓库🍂工作区, 暂存区, 版本库🍂版本库工作区 添加文件🍂查看文件🍂修改文件🍂版本回退🍂☃️案例 撤销修改…

k8s中cert-manager管理https证书

前言 目前https是刚需,但证书又很贵,虽然阿里云有免费的,但没有泛域名证书,每有一个子域名就要申请一个证书,有效期1年,1年一到全都的更换,太麻烦了。经过搜索,发现了自动更新证书神器cert-manager;当然cert-manager是基于k8s的。 安装采用Helm方式 Chart地址: ht…

THREE.JS动态场景开发实战【赛博朋克】

在本教程中,我们将探索如何创建类似 Three.js 的赛博朋克场景,灵感来自 Pipe 网站上的背景动画。 我们将指导你完成使用 Three.js 编码动态场景的过程,包括后处理效果和动态光照,所有这些都不需要任何着色器专业知识。 我用这个场…

西瓜书学习笔记——k近邻学习(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 K最近邻(K-Nearest Neighbors,KNN)是一种常用的监督学习算法,用于分类和回归任务。该算法基于一个简单的思想:如果一个样本在特征空间中的 k k k个最近邻居中的大多数属于某个类别…

vue+element 换肤功能

1.首先建深色和浅色两个主题样式变量样式表,样式表名和按钮中传入的值一样,本例中起名为default.scss和dark.scss 2.在data中定义主题变量名 zTheme:‘defalut’,默认引用defalut.scss, 在点击按钮时切换引用的样式表,达到换肤效果…

结合实例谈谈SPSS多元线性回归分析结果解读与报告撰写

为研究某地区房地产市场的价格与相关影响因素之间的关系,现从该地区采集了 20 份样本,数据如下表,请给出销售价格与相关影响因素之间的函数表达式,并从统计学角度分析这些因素之间的关系,最后预测 X 小区的平均销售价格…

【洛谷学习自留】p1055 ISBN 号码

解题思路: 1.首先考虑怎么分解字符串的问题,把字符串内的数字拿出来,这里我使用了String的toCharArray方法,将字符串内的所有字符拿出来,然后针对性的把所有数字轮流用于计算,因为数组内的数字是以字符的形…

中小学电子编程内部集中培训第三课

蜂鸣器学习 可视化代码 见链接: 利用小车写蜂鸣器

北朝隋唐文物展亮相广西,文物预防性保护网关保驾护航

一、霸府名都——太原博物馆收藏北朝隋朝文物展 2月1日,广西民族博物馆与太原博物馆携手,盛大开启“霸府名都——太原博物馆北朝隋文物展”。此次新春展览精选了北朝隋唐时期150多件晋阳文物珍品。依据“巍巍雄镇”“惊世古冢”“锦绣名都”三个单元&am…

某赛通电子文档安全管理系统 UploadFileList 任意文件读取漏洞复现

0x01 产品简介 某赛通电子文档安全管理系统(简称:CDG)是一款电子文档安全加密软件,该系统利用驱动层透明加密技术,通过对电子文档的加密保护,防止内部员工泄密和外部人员非法窃取企业核心重要数据资产,对电子文档进行全生命周期防护,系统具有透明加密、主动加密、智能…

用VsCode写python

1.创建一个文件夹 2.创建.py文件 print("Hello World") print("*"*10) 4.运行 在终端版本fileName python3 app.py

线性代数:线性方程组

目录 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理 一、线性方程组概念 二、消元法求线性方程组 三、系数阵的秩与线性方程组的解 无解 唯一解 无数解 相关定理

Redis -- hash哈希

马行软地易失蹄,人贪安逸易失志。 目录 关于Redis的hash hash命令 hset hget hexists hdel hkeys hvals hgetall hmget hlen hsetnx hash计数 hincrby hincrbyfloat 小结 关于Redis的hash 几乎所有的主流编程语言都提供了哈希(hash&a…

移动机器人激光SLAM导航(三):Hector SLAM 篇

参考引用 Hector_Mapping ROS-Wiki从零开始搭二维激光SLAM机器人工匠阿杰wpr_simulation 移动机器人激光SLAM导航(文章链接汇总) 1. 基于滤波器的 SLAM 问题 1.1 什么是 SLAM 什么是SLAM SLAM 就是为了构建地图用的,这个地图可以保存下来&…

将word中插入的zotero文献转为latex引用样式

在word中,可以使用zotero插件插入和管理参考文献。 例如: 若需要将这段内容移植到latex,就需要将对应的引用编号用\cite{}替换。手动替换非常麻烦且容易出错。要实现自动转换,可在zotero中定制一种新的引文格式,自动将…

常见的6种软件测试用例设计方法

常见的软件测试用例设计方法,个人认为主要是下面这6种: 流程图法(也叫场景法)等价类划分法边界值分析判定表正交法错误推测法 这6种常见方法中,我分别按照定义、应用场景、使用步骤、案例讲解这4个部分进行讲解。 所…

实习|基于SSM的实习管理系统设计与实现(源码+数据库+文档)

实习管理系统目录 目录 基于SSM的实习管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能介绍 (1)管理员登录 (2)实训方向管理 (3)公告信息管理 (4&#xff0…

STM32MP135开发板助力电力行业,IEC61850协议移植笔记

1.概述 IEC61850是变电站自动化系统(SAS)中通信系统和分散能源(DER)管理的国际标准。它通过标准的实现,实现了智能变电站的工程运作标准化。使得智能变电站的工程实施变得规范、统一和透明,在电力和储能系…

(java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~

目录 冒泡排序(BubbleSort): 代码详解: 冒泡排序的优化: 选择排序(SelectSort): 代码详解: 插入排序(InsertSort): 代码详解: 希尔排序(ShellSort): 法一…

Java中的常用API

常用API Object类浅克隆与深克隆 ObjectsObjects中的equals 包装类StringBuilder和StringBufferStringBuilder是可变字符串对象StringBuffer线程安全案例![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/87649c20e6464113a42aee5f16f1ee22.png) StringJoiner Object…