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

相关文章

大模型实战营第二期——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…

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

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

JavaScript 入门 完整版

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

用HTML5实现灯笼效果

本文介绍了两种实现效果:一种使用画布(canvas)标签/元素,另一种不用画布(canvas)标签/元素主要使用CSS实现。 使用画布(canvas)标签/元素实现,下面,在画布上…

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

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

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

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

JRebel激活-nginx版本

nginx转发流量(代替其他网上说的那个工具) proxy_pass http://idea.lanyus.com; 工具激活 填写内容说明: 第一行的激活网址是:http://127.0.0.1:8888/ 正确的GUID。GUID 可以通过专门的网站来生成(点击打开&#…

kettle控件-复制记录到结果/ 从结果获取记录的使用

在数据采集过程中,遇到对方数据传送不及时的情况,导致数据漏采集,需要手工反复补采。为了解决这一问题,可以利用kettle的复制记录到结果/从结果获取记录控件。 job的整个流程如下: 设置变量: 创建目录: ge…

STM32输出PWM波控制180°舵机

时间记录:2024/2/8 一、PWM介绍 (1)脉冲宽度调制 (2)占空比:高电平时间占整个周期时间的比例 (3)STM32通过定时器实现PWM时具有两种模式 PWM1模式:向上计数模式下&…

软件测试工程师——缺陷(一篇足以)

目录 定义 缺陷的类型 缺陷的严重程度 缺陷的状态 缺陷的根源 ​缺陷的来源 缺陷的起源 缺陷的生命周期 缺陷的识别 缺陷报告模板 编写缺陷报告的目的 缺陷报告编写的准则 缺陷描述的准则 定义 1. 软件未实现产品说明书中所提及的功能 2. 软件实现了产品说明书中…

echarts图表插件

图表组件 ECharts,全称为Enterprise Charts,是一个使用JavaScript实现的开源可视化库。它主要用于数据可视化领域,能够方便地创建出直观、交互性强的图表。ECharts由百度团队开发,目前是Apache的顶级项目之一。ECharts支持的图表…

JVM调优(Window下)

1、编写代码&#xff0c;像下面代码这样&#xff0c;产生OOM&#xff0c; private static final Integer K 1024;/*** 死循环&#xff0c;验证JVM调优* return*/GetMapping(value "/deadLoop")public void deadLoop(){int size K * K * 8;List<byte[]> lis…

Java后端技术助力,党员学习平台更稳定

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Linux介绍和命令使用

目录 目录 一、Linux简介 1.1 主流操作系统 1.2 Linux 发展历史 1.3 Linux系统版本 二、Linux安装 三、Linux 目录结构 四、Linux常用命令 4.1 基础常用命令说明 4.2 Linux 命令使用技巧 4.3 Linux 命令格式 4.4 进阶重点常用命令 4.4.1 拷贝移动命令 4.4.2 打包…

AI嵌入式K210项目(26)-二维码识别

文章目录 前言一、什么是二维码&#xff1f;二、实验准备三、实验过程四、API接口总结 前言 本章介绍基于机器视觉实现二维码识别&#xff0c;主要包含两个过程&#xff0c;首先检测图像中是否有二维码&#xff0c;如果有则框出并打印二维码信息&#xff1b; 一、什么是二维码…

STM32——LCD(1)认识

目录 一、初识LCD 1. LCD介绍 2. 显示器的分类 3. 像素 4. LED和OLED显示器 5. 显示器的基本参数 &#xff08;1&#xff09;像素 &#xff08;2&#xff09;分辨率 &#xff08;3&#xff09;色彩深度 &#xff08;4&#xff09;显示器尺寸 &#xff08;5&#xff…

Docker-Learn(二)保存、导入、使用Docker镜像

1.保存镜像 根据上一节内容&#xff0c;将创建好镜像进行保存&#xff0c;需要退出当前的已经在运行的docer命令行中断里面&#xff0c;可以通过在终端里面输入指令exit或者按下键盘上的 ctrlD建退出&#xff1a; 回到自己的终端里面&#xff0c;输入指令&#xff1a; docker…

计算机网络-数据链路层概述(功能概述 链路 数据链路 物理通道 逻辑通道)

文章目录 总览数据链路层的研究思想数据链路层的基本概念数据链路层功能概述 总览 封装成帧指的是数据链路层将来自上层的网络层数据包&#xff08;如IP数据报&#xff09;添加上自己的帧头和帧尾&#xff0c;形成一个完整的帧。这个过程包括了对数据的封装&#xff0c;以便于在…