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,一经查实,立即删除!

相关文章

M1芯片MAC 安装MySQL、Nacos遇到的问题

摘要:由于电脑上是M1芯片,安装软件时遇到一系列问题,记录下踩的坑!!! 安装MySQL MySQl官网下载链接区分ARM和X86架构,终端输入uname -a指令,本机显示为ARM czhczhdeiMac ~ % uname…

Git―基本操作

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

【华为OD机试】 最富裕的小家庭【2024 C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值, 一个节点及其直接相连的子节点被定义为一个小家庭。 现给你一颗树,请计算出最富裕的小家庭的财富和。 输入描述 …

k8s中cert-manager管理https证书

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

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

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

python tqdm进度条详解

文章目录 1. 语法1.1 tqdm 参数1.2 bar_format案例 2. 基本用法2.1 指定可迭代对象2.2 指定迭代次数2.3 设置显示信息2.3.1 设置进度条前缀(左侧)信息2.3.2 显示进度条后缀(右侧)信息 3. 项目案例参考 tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提…

学术写作|第二篇论文写作记录|GPT4论文润色Prompt

本文目录 写作时间安排如何写出初稿?找谁修改?1. 找AI修改2. 找师姐、师兄、老师、同行/外行修改论文修改意见集锦(反复观看)最好用的GPT4指令禁止转载,未经允许的任何引用。 写作时间安排 第二篇工作的idea去年就想出来了,一直被其他事情干扰,错过了N个会议… 在寒假…

西瓜书学习笔记——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方法,将字符串内的所有字符拿出来,然后针对性的把所有数字轮流用于计算,因为数组内的数字是以字符的形…

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

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

VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁

VMware:在部分链上无法执行所调用的函数,请打开父虚拟磁 问题:VMware给虚拟机扩展硬盘容量,提示:在部分链上无法执行所调用的函数,请打开父虚拟磁。原因:是因为你的虚拟磁盘文件是分多个文件存储的&#xf…

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

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

【程序员的自我修养】7. 动态链接

为什么要动态链接 浪费内存和和磁盘空间 每个程序都得拥有相同的拷贝程序的发布、更新和部署困难 更新任何一个小的模块,整个程序都需要重新链接 动态链接:将链接的过程推迟到运行时 节省内存减少物理页面的换入换出、增加CPU的缓存命中率更新升级方便…

LeetCode--88

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意:最终,合并后数组…

ChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI

文章目录 ChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI一、ChatGPT(OpenAI)的新版API调用1.1 环境变量配置与调用1.2 新版api调用1.3 命令行流式输出二、Gradio制作自己的聊天WebUIChatGPT实战100例 - (13) 写一个属于自己的 ChatGPT 新版 WebUI 今时不同往日…

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

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

用VsCode写python

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

线性代数:线性方程组

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