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.hqwc.cn/news/447836.html

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

相关文章

# Redis 分布式锁如何自动续期

Redis 分布式锁如何自动续期 何为分布式 分布式,从狭义上理解,也与集群差不多,但是它的组织比较松散,不像集群,有一定组织性,一台服务器宕了,其他的服务器可以顶上来。分布式的每一个节点&…

拓扑排序算法

操作对象:AOV网的点和边 有向无环图:有向图且不会形成回路 AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网 拓扑排序…

Web3生态系统:构建去中心化的数字社会

随着科技的飞速发展,我们正处在迈向数字未来的道路上,而Web3生态系统则成为这一变革的中心。不仅仅是技术的演进,Web3代表着对传统互联网体系的颠覆,致力于构建一个去中心化的数字社会。本文将深入探讨Web3的核心特征、对金融、社…

2024年美赛A题:资源可用性和性别比例 Resource Availability and Sex Ratios 思路模型代码解析

2024年美赛A题:资源可用性和性别比例 Resource Availability and Sex Ratios 思路模型代码解析 【点击最下方群名片,加入群聊,获取更多思路与代码哦~】 问题翻译 虽然一些动物物种存在于通常的雄性或雌性之外,但大多数物种在很大…

Linux系统Shell脚本-----------正则表达式 文本三剑客之---------grep、 sed

一、正则表达式 1.前言 正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。在Linux中也就是代表我们定义的模式模板&…

“错误: 不支持发行版本 XX”的解决方法

目录 1 查看Project Structure 1.1 打开Project Structure 1.2 查看Project Setting/Project 1.3 查看 Project Setting/Modules 1.4 查看Platform Setting/SDKs 2 查看Settings 2.1 打开Settings 2.2 查看Java Compiler 2.3 查看Maven/Runner 3 查看pom.xml 1 查…

AI算力专题:华为算力分拆:全球AI算力的第二极

今天分享的是AI算力系列深度研究报告:《AI算力专题:华为算力分拆:全球AI算力的第二极》。 (报告出品方:华西计算机团队) 报告共计:53页 全球龙头英伟达业绩持续高度景气,印证全球A…

k8s安装dashboard报错CrashLoopBackOff

报错信息 使用kubectl get pods -A查看集群,出现错误: kubernetes-dashboard kubernetes-dashboard-xxxxxxxxxx6-2qrst 0/1 CrashLoopBackOff 6 15m查看日志后,发现原因: panic: Get "https://10…

架构整洁之道-组件构建原则

5 组件构建原则 大型软件系统的架构过程与建筑物修建很类似,都是由一个个小组件组成的。所以,如果说SOLID原则是用于指导我们如何将砖块砌成墙与房间的,那么组件构建原则就是用来指导我们如何将这些房间组合成房子的。 5.1 组件 组件是软件的…

MySQL索引的原理和SQL优化策略

1. 索引 在InnoDB存储引擎中,索引分为聚簇索引和辅助索引两种类型。 聚簇索引是指基于表的主键构建的索引,它决定了表中数据的物理存储顺序。也就是说,聚簇索引中的键值按照主键的顺序来排序,并且每个叶子节点存储的是整个表行的…

基于SpringBoot Vue超市管理系统

大家好✌!我是Dwzun。很高兴你能来阅读我,我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结,还为大家分享优质的实战项目,本人在Java项目开发领域有多年的经验,陆续会更新更多优质的Java实战项目&#x…

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

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