热门标签 | 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



推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
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社区 版权所有