UnityShader:直接光照效果/点光/平行光阴影

效果:

代码:

Shader "MyShader/PhongNormal"
{Properties{_DiffuseTex("漫反射贴图",2d)="white"{}_AOTex("AO贴图",2d)="white"{}_SpecularMask("高光遮罩",2d)="white"{}_NormalMap("法线贴图",2d)="white"{}_NormalIntensity("凹凸程度",Range(0.0,10))=1.0_Shinesss("高光光滑度",float)=1.0_ShinIntensity("高光亮度",Range(0.0,10.0))=1.0}SubShader{Tags { "RenderType"="Opaque" }LOD 100Pass{Tags{"LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include "UnityCG.cginc"#include "AutoLight.cginc"#include "Lighting.cginc"float _Shinesss;float _ShinIntensity;float _NormalIntensity;sampler2D _DiffuseTex;float4 _DiffuseTex_ST;sampler2D _AOTex;sampler2D _SpecularMask;sampler2D _NormalMap;struct appdata{float4 vertex : POSITION;float3 normal : NORMAL;float2 texcoord : TEXCOORD0;float4 tangent : TANGENT;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal_Dir : TEXCOORD1;float3 worldPos : TEXCOORD2;float2 uv : TEXCOORD3;float3 worldTangent_Dir : TEXCOORD4;float3 worldBinormal_Dir : TEXCOORD5;SHADOW_COORDS(6)};v2f vert (appdata v){v2f o = (v2f)0;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal_Dir = normalize(mul(v.normal,unity_WorldToObject).xyz);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;o.uv = TRANSFORM_TEX(v.texcoord,_DiffuseTex);o.worldTangent_Dir = normalize(mul(unity_ObjectToWorld,v.tangent).xyz);o.worldBinormal_Dir = normalize(cross(o.worldNormal_Dir,o.worldTangent_Dir))*v.tangent.w;TRANSFER_VERTEX_TO_FRAGMENT(o);return o;}half4 frag (v2f i) : SV_Target{half4 diffuseColor = tex2D(_DiffuseTex,i.uv);half4 AOMask = tex2D(_AOTex,i.uv);half4 specularMask = tex2D(_SpecularMask,i.uv);half4 normalMap = tex2D(_NormalMap,i.uv);half3 normalMap_data = UnpackNormal(normalMap);half shadow = LIGHT_ATTENUATION(i);//Normal Maphalf3 worldNormal_Dir = normalize(i.worldNormal_Dir);half3 worldTangent_Dir = normalize(i.worldTangent_Dir);half3 worldBinormal_Dir = normalize(i.worldBinormal_Dir);worldNormal_Dir = normalize(worldTangent_Dir*normalMap_data.x*_NormalIntensity+worldBinormal_Dir*normalMap_data.y*_NormalIntensity+worldNormal_Dir*normalMap_data.z);half3 worldView_Dir = normalize(_WorldSpaceCameraPos.xyz-i.worldPos);half3 worldLight_Dir = normalize(_WorldSpaceLightPos0.xyz);half3 reflect_Dir = normalize(reflect(-worldLight_Dir,worldNormal_Dir));half NdotL = dot(worldNormal_Dir,worldLight_Dir);half RdotV = dot(reflect_Dir,worldView_Dir);half diffterm = min(max(0.0,NdotL),shadow);half3 diffuse = diffterm*_LightColor0.xyz*diffuseColor.xyz;half3 specular = pow(max(0.0,RdotV),_Shinesss)*_LightColor0.xyz*_ShinIntensity*specularMask.rgb*diffterm;half3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz*diffuse*AOMask;half3 final_color = diffuse+specular+ambient;return half4(final_color,1.0);}ENDCG}Pass{Tags{"LightMode"="ForwardAdd"}Blend One OneCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdadd#include "UnityCG.cginc"#include "AutoLight.cginc"#include "Lighting.cginc"float _Shinesss;float _ShinIntensity;float _NormalIntensity;sampler2D _DiffuseTex;float4 _DiffuseTex_ST;sampler2D _AOTex;sampler2D _SpecularMask;sampler2D _NormalMap;struct appdata{float4 vertex : POSITION;float3 normal : NORMAL;float2 texcoord : TEXCOORD0;float4 tangent : TANGENT;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal_Dir : TEXCOORD1;float3 worldPos : TEXCOORD2;float2 uv : TEXCOORD3;float3 worldTangent_Dir : TEXCOORD4;float3 worldBinormal_Dir : TEXCOORD5;LIGHTING_COORDS(6,7)};v2f vert (appdata v){v2f o = (v2f)0;o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal_Dir = normalize(mul(v.normal,unity_WorldToObject).xyz);o.worldPos = mul(unity_ObjectToWorld,v.vertex).xyz;o.uv = TRANSFORM_TEX(v.texcoord,_DiffuseTex);o.worldTangent_Dir = normalize(mul(unity_ObjectToWorld,v.tangent).xyz);o.worldBinormal_Dir = normalize(cross(o.worldNormal_Dir,o.worldTangent_Dir))*v.tangent.w;TRANSFER_VERTEX_TO_FRAGMENT(o);return o;}half4 frag (v2f i) : SV_Target{half4 diffuseColor = tex2D(_DiffuseTex,i.uv);half4 specularMask = tex2D(_SpecularMask,i.uv);half4 normalMap = tex2D(_NormalMap,i.uv);half3 normalMap_data = UnpackNormal(normalMap);half shadowAtte = LIGHT_ATTENUATION(i);//Normal Maphalf3 worldNormal_Dir = normalize(i.worldNormal_Dir);half3 worldTangent_Dir = normalize(i.worldTangent_Dir);half3 worldBinormal_Dir = normalize(i.worldBinormal_Dir);worldNormal_Dir = normalize(worldTangent_Dir*normalMap_data.x*_NormalIntensity+worldBinormal_Dir*normalMap_data.y*_NormalIntensity+worldNormal_Dir*normalMap_data.z);half3 worldView_Dir = normalize(_WorldSpaceCameraPos.xyz-i.worldPos);#if defined(DIRECTIONAL)half3 worldLight_Dir = normalize(_WorldSpaceLightPos0.xyz);#elif defined(POINT)half3 worldLight_Dir = normalize(_WorldSpaceLightPos0.xyz-i.worldPos);#endifhalf3 reflect_Dir = normalize(reflect(-worldLight_Dir,worldNormal_Dir));half NdotL = dot(worldNormal_Dir,worldLight_Dir);half RdotV = dot(reflect_Dir,worldView_Dir);half diffterm = min(max(0.0,NdotL),shadowAtte);half3 diffuse = diffterm*_LightColor0.xyz*diffuseColor.xyz;half3 specular = pow(max(0.0,RdotV),_Shinesss)*_LightColor0.xyz*_ShinIntensity*specularMask.rgb*shadowAtte;half3 final_color = diffuse+specular;return half4(final_color,1.0);}ENDCG}}FallBack "Diffuse"
}

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

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

相关文章

Java多线程是什么?七大线程状态总结

前言 大家好,我是chowley,马上大年三十了,提前祝大家新春快乐,这篇来总结一下Java多线程方面内容。 在Java编程中,多线程是一种重要的特性,它允许程序同时执行多个任务,从而提高程序的性能和效…

大模型实战营第二期——2. 浦语大模型趣味Demo

文章目录 1. 大模型及InternLM模型介绍2. InternLM-Chat-7B智能对话Demo2.1 基本说明2.2 实际操作2.2.1 创建开发机2.2.2 conda环境配置2.2.3 模型下载2.2.4 InternLM代码库下载和修改2.2.5 cli运行2.2.6 web_demo运行 3. Lagent智能体工具调用Demo3.1 基本说明3.2 实际操作3.2…

商业智能(BI)数据分析、挖掘概念

商业智能(BI)数据分析挖掘概念 一、商业智能(BI)数据分析挖掘概念 数据挖掘目前在各类企业和机构中蓬勃发展。因此我们制作了一份此领域常见术语总结。 1.分析型客户关系管理(Analytical CRM/aCRM 用于支持决策&…

nodeJS 的 npm 设置国内高速镜像之淘宝镜像的方法

1、我们知道 nodeJS 是老外搞出来的,服务器放在了国外,国内的小朋友访问起来会比较慢,阿里巴巴的淘宝给出了有力支持,现在我们就将 nodeJS 的镜像地址切换为国内的淘宝镜像。 2、查看当前的镜像地址: npm get registr…

【大厂AI课学习笔记】1.5 AI技术领域(4)CV的六大场景

计算机视觉,是研究如何让计算机象人类一样看的科学。 Computer Vision,我们也称为CV。 它一共有六大场景。 分别是: 图像分类、图像重建、目标检测、图像搜索、图像分割、目标动向监测。 计算机视觉六大场景详解 一、图像分类&#xff…

mysql 数据库基础知识

一、什么是主从复制? 主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库 简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而…

数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)

数据库管理147期 2024-02-07 数据库管理-第147期 最强Oracle监控EMCC深入使用-04(20240207)1 发现Exadata2 Exadata监控计算节点:存储节点RoCE交换机管理交换机PDU 总结 数据库管理-第147期 最强Oracle监控EMCC深入使用-04(202402…

mybatis动态循环拼接SQL,动态拼接字段 和动态拼接 LEFT JOIN

mybatis动态循环拼接SQL,动态拼接字段 和动态拼接 LEFT JOIN select T.BUSINESS_KEY_ "businessKey",D.JHBM "jhbm",D.JHBM || DO.DOC_NAME AS "designDoc",T.PROC_INST_ID_ "lcId",TO_CHAR( T.END_TIME_, yyyy-MM-dd hh24…

P8597 [蓝桥杯 2013 省 B] 翻硬币--2024蓝桥杯冲刺省一

点击跳转例题 我们读完题发现就是简单的模拟&#xff0c;如果不一样&#xff0c;我们就操作一次就行了。 #include <bits/stdc.h> #define int long long //(有超时风险) #define PII pair<int,int> #define endl \n #define LL __int128using namespace std;const…

JavaScript 入门 完整版

目录 第一个知识点&#xff1a;引入js文件 内部引用: 外部引用: 第二个知识点&#xff1a;javascript的基本语法 定义变量&#xff1a; 条件控制(if - else if - else) 第三个知识点&#xff1a;javascript里的数据类型、运算符&#xff1a; 数字类型 字符串类型 布尔…

行为型设计模式—备忘录模式

备忘录模式&#xff1a;不破坏封装的前提下&#xff0c; 捕获一个对象的内部状态&#xff0c; 并在对象之外保存这个状态。 这样以后就可将该对象恢复到原先保存的状态。即利用快照的思想实现对象的版本更替。 备忘录模式主要适用于以下应用场景。 需要保存历史快照的场景。希…

用HTML5实现灯笼效果

本文介绍了两种实现效果&#xff1a;一种使用画布&#xff08;canvas&#xff09;标签/元素&#xff0c;另一种不用画布&#xff08;canvas&#xff09;标签/元素主要使用CSS实现。 使用画布&#xff08;canvas&#xff09;标签/元素实现&#xff0c;下面&#xff0c;在画布上…

【大数据面试题】005 谈一谈 Flink Watermark 水印

一步一个脚印&#xff0c;一天一道面试题。 感觉我现在很难把水印描述的很好&#xff0c;但&#xff0c;完成比完美更重要。后续我再补充。各位如果有什么建议或补充也欢迎留言。 在实时处理任务时&#xff0c;由于网络延迟&#xff0c;人工异常&#xff0c;各种问题&#xf…

PyTorch、NCNN、CV::Mat三者张量的shape

目录 一、PyTorch二、NCNN三、CV::Mat 一、PyTorch 在 PyTorch 中&#xff0c;张量&#xff08;Tensor&#xff09;的形状通常按照 (N, C, H, W) 的顺序排列&#xff0c;其中&#xff1a; N 是批量大小&#xff08;batch size&#xff09; C 是通道数&#xff08;channel numb…

【什么是IDE?新手用哪个IDE比较好?——详细讲解】

什么是IDE&#xff1f;新手用哪个IDE比较好&#xff1f; 1. 什么是IDE&#xff1f;2. 新手适用的IDE 1. 什么是IDE&#xff1f; IDE是集成开发环境&#xff08;Integrated Development Environment&#xff09;的缩写&#xff0c;它是集合了程序开发中多种工具的应用软件。IDE…

机器学习 | 深入集成学习的精髓及实战技巧挑战

目录 xgboost算法简介 泰坦尼克号乘客生存预测(实操) lightGBM算法简介 《绝地求生》玩家排名预测(实操) xgboost算法简介 XGBoost全名叫极端梯度提升树&#xff0c;XGBoost是集成学习方法的王牌&#xff0c;在Kaggle数据挖掘比赛中&#xff0c;大部分获胜者用了XGBoost。…

webp是什么格式,怎么转成.jpg

WebP是一种旨在加快图像加载时间的现代图像格式。这种格式由Google开发&#xff0c;支持无损压缩和有损压缩。WebP格式的图像文件通常比同等质量的JPEG或PNG文件小&#xff0c;这使得它们在提高网页加载速度方面特别有用。 要将WebP格式转换成JPEG格式&#xff0c;我们可以使用…

Java串口通信技术探究3:RXTX库线程 优化系统性能的SerialPortEventListener类

目录 一、失败方案串口监听工具Controller层MySerialPortEventListenerimpl 二、成功方案串口监听工具Controller层MySerialPortEventListenerimpl前端Api 在之前的文章中&#xff0c;我们讨论了使用单例模式的SerialPortEventListener类。然而&#xff0c;这种模式在某些情况下…

【代码随想录26】332.重新安排行程 51.N皇后 37.解数独

目录 332.重新安排行程题目描述参考代码 51.N皇后题目描述参考代码 37.解数独题目描述参考代码 332.重新安排行程 题目描述 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机…

09-错误处理

上一篇&#xff1a;08-常用集合(容器) 在软件中&#xff0c;错误是一个不争的事实&#xff0c;因此 Rust 提供了许多功能来处理出错的情况。在许多情况下&#xff0c;Rust 要求您在编译代码之前承认出错的可能性并采取一些措施。这一要求可确保您在将代码部署到生产环境之前发现…