热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unityshader学习之标准的Unityshader

包含光照,可处理多个光源,有光照衰减和阴影的shader,代码如下:转载请注明出处:http:www.cnbl

包含光照,可处理多个光源,有光照衰减和阴影的shader,代码如下:

转载请注明出处:http://www.cnblogs.com/jietian331/p/7199311.html

Shader "Custom/Bumped Specular"
{Properties{_MainTex(
"Main Texture", 2D) = "white" {}_NormalMap("Normal Map", 2D) = "bump" {}_Specular("Specular", Color) = (1,1,1,1)_Gloss("Gloss", Range(8, 256)) = 8}SubShader{Tags{"Queue" = "Geometry""RenderType" = "Opaque"}Pass{Tags{"LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"sampler2D _MainTex;float4 _MainTex_ST;sampler2D _NormalMap;float4 _NormalMap_ST;fixed4 _Specular;float _Gloss;struct appdata{float4 vertex : POSITION;float4 uv : TEXCOORD0;fixed4 color : COLOR;float4 tangent : TANGENT;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float4 uv : TEXCOORD0;fixed4 color : COLOR;float4 T2W1 : TEXCOORD1;float4 T2W2 : TEXCOORD2;float4 T2W3 : TEXCOORD3;SHADOW_COORDS(4)};v2f vert(appdata v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);float2 uv1 = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;float2 uv2 = v.uv.zw * _NormalMap_ST.xy + _NormalMap_ST.zw;o.uv = float4(uv1, uv2);o.color = v.color;float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);float3 worldNormal = UnityObjectToWorldNormal(v.normal);float3 binormal = cross(normalize(worldNormal), normalize(worldTangent)) * v.tangent.w;float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.T2W1 = float4(worldTangent.x, binormal.x, worldNormal.x, worldPos.x);o.T2W2 = float4(worldTangent.y, binormal.y, worldNormal.y, worldPos.y);o.T2W3 = float4(worldTangent.z, binormal.z, worldNormal.z, worldPos.z);TRANSFER_SHADOW(o);return o;}fixed4 frag(v2f i) : SV_TARGET{float3 worldPos = float3(i.T2W1.w, i.T2W2.w, i.T2W3.w);float3 worldLight = normalize(UnityWorldSpaceLightDir(worldPos));float3 worldView = normalize(UnityWorldSpaceViewDir(worldPos));fixed4 albedo = tex2D(_MainTex, i.uv.xy) * i.color;float3 tangentNormal = UnpackNormal(tex2D(_NormalMap, i.uv.zw));float3x3 tanToWorld = float3x3(i.T2W1.xyz, i.T2W2.xyz, i.T2W3.xyz);float3 worldNormal = mul(tanToWorld, tangentNormal);fixed3 ambient = albedo.xyz * UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 diffuse = albedo.xyz * _LightColor0.xyz * max(0, dot(worldLight, worldNormal));float3 halfDir = normalize(worldLight + worldView);fixed3 specular = albedo.xyz * _Specular * pow(max(0, dot(worldNormal, halfDir)), _Gloss);UNITY_LIGHT_ATTENUATION(atten, i, worldPos);fixed3 col = ambient + (diffuse + specular) * atten;return fixed4(col, 1);}ENDCG}Pass{Tags{"LightMode" = "ForwardAdd"}Blend One OneCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdadd_fullshadows#include "UnityCG.cginc"#include "Lighting.cginc"#include "AutoLight.cginc"sampler2D _MainTex;float4 _MainTex_ST;sampler2D _NormalMap;float4 _NormalMap_ST;fixed4 _Specular;float _Gloss;struct appdata{float4 vertex : POSITION;float4 uv : TEXCOORD0;fixed4 color : COLOR;float4 tangent : TANGENT;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float4 uv : TEXCOORD0;fixed4 color : COLOR;float4 T2W1 : TEXCOORD1;float4 T2W2 : TEXCOORD2;float4 T2W3 : TEXCOORD3;SHADOW_COORDS(4)};v2f vert(appdata v){v2f o;o.pos = mul(UNITY_MATRIX_MVP, v.vertex);float2 uv1 = v.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;float2 uv2 = v.uv.zw * _NormalMap_ST.xy + _NormalMap_ST.zw;o.uv = float4(uv1, uv2);o.color = v.color;float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);float3 worldNormal = UnityObjectToWorldNormal(v.normal);float3 binormal = cross(normalize(worldNormal), normalize(worldTangent)) * v.tangent.w;float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;o.T2W1 = float4(worldTangent.x, binormal.x, worldNormal.x, worldPos.x);o.T2W2 = float4(worldTangent.y, binormal.y, worldNormal.y, worldPos.y);o.T2W3 = float4(worldTangent.z, binormal.z, worldNormal.z, worldPos.z);TRANSFER_SHADOW(o);return o;}fixed4 frag(v2f i) : SV_TARGET{float3 worldPos = float3(i.T2W1.w, i.T2W2.w, i.T2W3.w);float3 worldLight = normalize(UnityWorldSpaceLightDir(worldPos));float3 worldView = normalize(UnityWorldSpaceViewDir(worldPos));fixed4 albedo = tex2D(_MainTex, i.uv.xy) * i.color;float3 tangentNormal = UnpackNormal(tex2D(_NormalMap, i.uv.zw));float3x3 tanToWorld = float3x3(i.T2W1.xyz, i.T2W2.xyz, i.T2W3.xyz);float3 worldNormal = mul(tanToWorld, tangentNormal);fixed3 diffuse = albedo.xyz * _LightColor0.xyz * max(0, dot(worldLight, worldNormal));float3 halfDir = normalize(worldLight + worldView);fixed3 specular = albedo.xyz * _Specular * pow(max(0, dot(worldNormal, halfDir)), _Gloss);UNITY_LIGHT_ATTENUATION(atten, i, worldPos);fixed3 col = (diffuse + specular) * atten;return fixed4(col, 1);}ENDCG}}Fallback "Specular"
}

效果如下:

 

转:https://www.cnblogs.com/jietian331/p/7199311.html



推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
我家在波力牧场
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有