简单写写,练下手~

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. SQL EXCEPT INTERSECT

    EXCEPT是指在第一个集合中存在,但是不存在于第二个集合中的数据. INTERSECT是指在两个集合中都存在的数据. )) go )) go insert into t1 ,'t1' union a ...

  2. 潭州课堂25班:Ph201805201 WEB 之 CSS 第三课 (课堂笔记)

    在 CSS 中第个标签都可以认为是个盒子,盒子就有以下几层 边框 border border-top: 5px solid black; /*上边框 实线*/ border-right: 3px do ...

  3. 潭州课堂25班:Ph201805201 MySQL第三课 (课堂笔记)

    单表查询: select * from select sname from stu; 条件查询 select sname from stu where sid=2; select sname from ...

  4. 喵哈哈村的魔法考试 Round #14 (Div.2) 题解

    喵哈哈村的四月半活动(一) 题解: 唯一的case,就是两边长度一样的时候,第三边只有一种情况. #include <iostream> #include <cstdio> # ...

  5. Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解

    简述 Unity supports different Rendering Paths. You should choose which one you use depending on your g ...

  6. Java 语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...

  7. XMPP接受发送消息

    在现阶段的通信服务中,各种标准都有,因此会出现无法实现相互连通,而XMPP(Extensible Message and presence Protocol)协议的出现,实现了整个及时通信服务协议的互 ...

  8. Morris图表使用小记

    挺好用的,碰到几个问题,有的是瞎试解决了的: 1.我想折线图能够响应单击事件,即点击某个节点后,就能加载进一步的信息,帮助没找到,参照另外一个地方的写法,居然支持事件 Morris.Line({ el ...

  9. 通俗理解word2vec

    https://www.jianshu.com/p/471d9bfbd72f 独热编码 独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有 ...

  10. Python:提取网页中的电子邮箱

    import requests, re #regex = r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)"#这个正则表达式过滤 ...