练手之RimLight
简单写写,练下手~
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的更多相关文章
- Python学习路径及练手项目合集
Python学习路径及练手项目合集 https://zhuanlan.zhihu.com/p/23561159
- Cocos2d-Lua (练手) 微信打飞机
学习下lua,目前入门级,使用版本为 v3.3 Final For Win,空闲时间不足,只能断断续续写点东西. 一.子弹效果 子弹只做了一种,扇形发射,可以增加扇形大小,子弹的 ...
- web前端学习部落22群分享给需要前端练手项目
前端学习还是很有趣的,可以较快的上手然后自己开发一些好玩的项目来练手,网上也可以一抓一大把关于前端开发的小项目,可是还是有新手在学习的时候不知道可以做什么,以及怎么做,因此,就整理了一些前端项目教程, ...
- webpack练手项目之easySlide(三):commonChunks(转)
Hello,大家好. 在之前两篇文章中: webpack练手项目之easySlide(一):初探webpack webpack练手项目之easySlide(二):代码分割 与大家分享了webpack的 ...
- webpack练手项目之easySlide(二):代码分割(转)
在上一篇 webpack练手项目之easySlide(一):初探webpack 中我们一起为大家介绍了webpack的基本用法,使用webpack对前端代码进行模块化打包. 但是乍一看webpack ...
- webpack练手项目之easySlide(一):初探webpack (转)
最近在学习webpack,正好拿了之前做的一个小组件,图片轮播来做了下练手,让我们一起来初步感受下webpack的神奇魅力. webpack是一个前端的打包管理工具,大家可以前往:http:/ ...
- JAVA大数类练手
今天突然看到了OJ上的大数类题目,由于学习了一点大数类的知识.果断水了6道题......都是非常基础的.就当的练手的吧. 学到的只是一些大数类的基本操作.以后多做点这样的题,争取熟练运用水大数题... ...
- Python之路【第二十四篇】:Python学习路径及练手项目合集
Python学习路径及练手项目合集 Wayne Shi· 2 个月前 参照:https://zhuanlan.zhihu.com/p/23561159 更多文章欢迎关注专栏:学习编程. 本系列Py ...
- node论坛练手
当时学node,自己写了个论坛练手,现在看还是有很多问题,有时间好好改改 https://github.com/hitbs228/countdown
随机推荐
- 生产环境中tomcat的配置
生产环境中要以daemon方式运行tomcat 通常在开发环境中,我们使用$CATALINA_HOME/bin/startup.sh来启动tomcat, 使用$CATALINA_HOME/bin/sh ...
- flask-include标签使用标签
[footer.html] <footer> 这是底部 </footer> [header.html] <style> .nav ul{ overflow: h ...
- China Operating System 电脑操作系统 2016全球互联网排名
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 电脑操作系统 China Operating System 2016全球互联网排名 == ...
- 洛谷.3121.审查(AC自动机 链表)
题目链接 //删掉一个单词需要前移一段位置,用链表维护就好了 复杂度O(sum(len)) #include <cstdio> #include <cstring> #defi ...
- memcached协议解析
本文转载自:http://www.ccvita.com/306.html 协议memcached 的客户端使用TCP链接与服务器通讯.(UDP接口也同样有效,参考后文的 “UDP协议” )一个运行中的 ...
- 【Spark】Spark性能调优
官网:http://spark.apache.org/docs/latest/tuning.html 1.引言 提到Spark与Hadoop的区别,基本最常说的就是Spark采用基于内存的计算方式,尽 ...
- springMVC返回json数据时date类型数据被转成long类型
在项目的过程中肯定会遇到ajax请求,但是再用的过程中会发现,在数据库中好好的时间类型数据:2017-05-04 17:52:24 在转json的时候,得到的就不是时间格式了 而是145245121这 ...
- cygwin下切换到其他磁盘
转自:https://blog.csdn.net/lts_cxl/article/details/17248727 cygwin安装之后,无法直接访问e,c,d等盘的目录. 运行df -h 命令,发 ...
- oracle 11g 安装及netca,dbca乱码之解决
在中文Linux下安装Oracle 11g,运行runInstaller后默认会出现乱码,解决办法如下: 1.准备字体zysong.ttf,点击下载,解压下载到的fallback 2.使用归档管理器打 ...
- 使用Guava的ComparisonChain实现自定义的排序
可以看到使用比较器前,先要写一个实体类,还要实现comparable接口,实现compareTo方法.这个方法一般会返回-1 0 1三个int类型数字,分别表示,对象和传入的对象比较,排序应该在传入的 ...