简单写写,练下手~

Shader "James/VP Shader/RimLight"
{
Properties
{
_MainTex("MainTex", 2D) = "white" {}
_Color("Color", Color) = (, , , )
_RimColor("RimColor", Color) = (, , , )
_RimPower("RimPower", Range(, )) = 0.1
_RimIntensity("RimIntensity", Range(, )) =
} SubShader
{
Tags { "Queue" = "Transparent" }
Pass
{
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" struct v2f
{
float4 pos : SV_POSITION;
float3 color : COLOR0;
float2 uv : TEXCOORD0;
float3 normal : TEXCOORD1;
float3 objViewDir : TEXCOORD2;
}; sampler2D _MainTex;
float4 _MainTex_ST;
float4 _Color; v2f vert(appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.normal = v.normal;
o.objViewDir = normalize(ObjSpaceViewDir(v.vertex));
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
} float4 _RimColor;
float _RimPower;
float _RimIntensity; half4 frag(v2f i) : COLOR
{
float rimSin = - max(, dot(i.normal, i.objViewDir));
float rimFactor = pow(rimSin, _RimPower) * _RimIntensity;
float3 rimColor = rimFactor * _RimColor; float4 mainColor = tex2D(_MainTex, i.uv);
float4 finalColor = mainColor * _Color;
finalColor.rgb +=rimColor;
return finalColor;
} ENDCG
}
}
FallBack "VertexLit"
}

   将上面的Shader改写一下,添加BumpTex,并使用一张RimTex来映射边缘光的强度:

Shader "James/VP Shader/BumpRimLight"
{
Properties
{
_MainTex("MainTex", 2D) = "white" {}
_BumpTex("BumpTex", 2D) = "bump" {}
_Color("Color", Color) = (, , , )
_RimColor("RimColor", Color) = (, , , )
_RimIntensity("RimIntensity", Range(, )) = 0.1
_RimTex("RimTex", 2D) = "white" {}
} SubShader
{
Tags { "Queue" = "Transparent" }
Pass
{
Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc" struct v2f
{
float4 pos : SV_POSITION;
float3 color : COLOR0;
float2 uv : TEXCOORD0;
float3 tangentSpackLightDir : TEXCOORD1;
}; sampler2D _MainTex;
sampler2D _BumpTex;
sampler2D _RimTex;
float4 _MainTex_ST;
float4 _BumpTex_ST;
float4 _RimTex_ST;
float4 _Color;
float4 _RimColor;
float _RimIntensity; v2f vert(appdata_tan v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
float3 objViewDir = normalize(ObjSpaceViewDir(v.vertex));
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex); // 副法向量
float3 binormal = cross(normalize(v.vertex), normalize(v.tangent.xyz));
// 切空间矩阵
float3x3 rotation = float3x3(v.tangent.xyz, binormal, v.normal);
// 切空间视线方向
o.tangentSpackLightDir = mul(rotation, objViewDir); return o;
} half4 frag(v2f i) : COLOR
{
// 切空间法线,NormalMap默认带的是切空间的值
half3 tangentSpaceNormal = (tex2D(_BumpTex, i.uv).rgb * 2.0) - 1.0;
float rimFactor = - max(, dot(tangentSpaceNormal, i.tangentSpackLightDir));
float rimIntensity = tex2D(_RimTex, rimFactor.xx).r;
float3 rimColor = rimIntensity * _RimColor * _RimIntensity; float4 mainColor = tex2D(_MainTex, i.uv);
float4 finalColor = mainColor * _Color;
finalColor.rgb += rimColor;
return finalColor;
} ENDCG
}
}
FallBack "VertexLit"
}

   注意上述代码是在切空间中计算rim的颜色强度。

练手之RimLight的更多相关文章

  1. Python学习路径及练手项目合集

    Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159

  2. Cocos2d-Lua (练手) 微信打飞机

    学习下lua,目前入门级,使用版本为 v3.3 Final For Win,空闲时间不足,只能断断续续写点东西.   一.子弹效果          子弹只做了一种,扇形发射,可以增加扇形大小,子弹的 ...

  3. web前端学习部落22群分享给需要前端练手项目

    前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程, ...

  4. webpack练手项目之easySlide(三):commonChunks(转)

    Hello,大家好. 在之前两篇文章中: webpack练手项目之easySlide(一):初探webpack webpack练手项目之easySlide(二):代码分割 与大家分享了webpack的 ...

  5. webpack练手项目之easySlide(二):代码分割(转)

    在上一篇 webpack练手项目之easySlide(一):初探webpack  中我们一起为大家介绍了webpack的基本用法,使用webpack对前端代码进行模块化打包. 但是乍一看webpack ...

  6. webpack练手项目之easySlide(一):初探webpack (转)

    最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力.     webpack是一个前端的打包管理工具,大家可以前往:http:/ ...

  7. JAVA大数类练手

    今天突然看到了OJ上的大数类题目,由于学习了一点大数类的知识.果断水了6道题......都是非常基础的.就当的练手的吧. 学到的只是一些大数类的基本操作.以后多做点这样的题,争取熟练运用水大数题... ...

  8. Python之路【第二十四篇】:Python学习路径及练手项目合集

      Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...

  9. node论坛练手

    当时学node,自己写了个论坛练手,现在看还是有很多问题,有时间好好改改 https://github.com/hitbs228/countdown

随机推荐

  1. Codechef October Challenge 2018 游记

    Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小 ...

  2. 早期(编译器)优化--javac编译器

    java语言的“编译期”其实是一段“不确定”的操作过程,可能是指一个前端编译器把.java变成.class的过程,也可能是指虚拟机的后端运行期编译器(JLT)把字节码转变成机器码的过程,也有可能是使用 ...

  3. [Beego模型] 四、使用SQL语句进行查询

    [Beego模型] 一.ORM 使用方法 [Beego模型] 二.CRUD 操作 [Beego模型] 三.高级查询 [Beego模型] 四.使用SQL语句进行查询 [Beego模型] 五.构造查询 [ ...

  4. Delphi不注册COM直接使用ActiveX控件并绑定事件

    文笔不行,直接上源码: 主窗口: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System ...

  5. 慎用ArrayList的contains方法,使用HashSet的contains方法代替

    在启动一个应用的时候,发现其中有一处数据加载要数分钟,刚开始以为是需要load的数据比较多的缘故,查了一下数据库有6条左右,但是单独写了一个数据读取的方法,将这6万多条全部读过来,却只需要不到10秒钟 ...

  6. bugly中批量隐藏版本

    App项目使用Bugly的内测分发功能进行整包的测试,但日积月累之后,版本就会特别多.而线上同时跑的版本可能不过三个左右,那么多版本会干扰到查看崩溃.选择版本,如何隐藏呢? 右上角,更多 –> ...

  7. Spring Date JPA 更新部分字段

    在Spring Data JPA 中,新增和更新操作都是用save()的方式进行,JPA是通过什么方法来知道我们是要进行insert还是update呢? 经过测试,JPA对程序调用的save()方法判 ...

  8. 给力开源,.Net开源地址大收集

    一.基础类库: 1,项目名:Npoi 资源星级:★★★ (个人评的) 介绍:NPOI - 一个能帮助你直接读写office文件流的库 系统教程:http://www.cnblogs.com/tonyq ...

  9. 高性能JavaScript之DOM编程

    我们知道.DOM是用于操作XML和HTML文档的应用程序接口,用脚本进行DOM操作的代价非常昂贵. 有个贴切的比喻.把DOM和JavaScript(这里指ECMScript)各自想象为一个岛屿,它们之 ...

  10. 操作argc, argv的经典写法

    [问题] 我在看boost源代码的时候看到如下的代码, template<class charT> basic_command_line_parser<charT>:: bas ...