Unity3D-Shader-实现X光效果
【旧博客转移 - 2016年1月3日 16:40 】
最近学习了一些Shader效果,打算把学到的知识总结一下,这篇讲一下这种轮廓发光的效果(如下图所示),也有一些地方管这个叫X光

1.原理
2.代码
Shader "lijia/Xray"
{
Properties
{
_RimColor("RimColor", Color) = (, , , )
_RimIntensity("Intensity", Range(, )) =
}
SubShader
{
Tags {"Queue"="Transparent" "RenderType"="Opaque" } LOD
Pass
{
Blend SrcAlpha One//打开混合模式
ZWrite off
Lighting off CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float3 normal:Normal;
}; struct v2f
{
float4 pos : SV_POSITION;
fixed4 color:COLOR;
}; fixed4 _RimColor;
float _RimIntensity; v2f vert (appdata v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));//计算出顶点到相机的向量
float val = - saturate(dot(v.normal, viewDir));//计算点乘值
o.color = _RimColor * val * ( + _RimIntensity);//计算强度
return o;
} fixed4 frag (v2f i) : COLOR
{
return i.color;
}
ENDCG
}
}
}
float3 viewDir = normalize(ObjSpaceViewDir(v.vertex));//计算出顶点到相机的向量
这一句是调用了UnityCG.cginc库中的ObjSpaceViewDir方法,获得viewDir
inline float3 ObjSpaceViewDir( in float4 v )
{
float3 objSpaceCameraPos = mul(_World2Object, float4(_WorldSpaceCameraPos.xyz, )).xyz;
return objSpaceCameraPos - v.xyz;
}
翻看UnityCG中ObjSpaceViewDir方法的源码,发现它是拿到_WorldSpaceCameraPos(世界坐标相机的位置),左乘World2Object矩阵,转成模型坐标系
最后objSpaceCameraPos - v.xyz (向量相减),得到viewDir向量
viewDir跟normal的点乘值,就表示两个向量的夹角大小
- 夹角 < 90°时,点乘>0
- 夹角 = 90°时,点乘=0
- 夹角 > 90°时,点乘<0
边缘的顶点,点乘值接近90度,也就是值接近0,所以这里用1减去点乘值( saturate函数:返回0-1之间的数 )
float val = 1 - saturate(dot(v.normal, viewDir)); 计算出颜色强度后,把颜色传给fragment着色器去输出渲染,就可以看到效果了
Unity3D-Shader-实现X光效果的更多相关文章
- Unity3D Shader图像扭曲过场效果
把脚本挂在摄像机上 using UnityEngine; using System.Collections; [RequireComponent(typeof(Camera))] public cla ...
- pixijs shader贴图扫光效果
pixijs shader贴图扫光效果 直接贴代码 const app = new PIXI.Application({ transparent: true }); document.body.app ...
- three.js后期之自定义shader通道实现扫光效果
如果你还不知道如何在three.js中添加后期渲染通道,请先看一下官方的一个最简单的demo : github. 正如demo中所示的那样,我们的扫光效果,也是一个自定义的ShaderPass. 所以 ...
- 【译】Unity3D Shader 新手教程(1/6)
本文为翻译,附上原文链接. 转载请注明出处--polobymulberry-博客园. 刚开始接触Unity3D Shader编程时,你会发现有关shader的文档相当散,这也造成初学者对Unity3D ...
- 【浅墨Unity3D Shader编程】之一 夏威夷篇:游戏场景的创建 & 第一个Shader的书写
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 作者:毛星云(浅墨) ...
- 转 猫都能学会的Unity3D Shader入门指南(二)
猫都能学会的Unity3D Shader入门指南(二) 关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己 ...
- Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
- 【浅墨Unity3D Shader编程】之二 雪山飞狐篇:Unity的基本Shader框架写法&颜色、光照与材质
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/40955607 作者:毛星云(浅墨) ...
- 猫都能学会的Unity3D Shader入门指南(二)
关于本系列 这是Unity3D Shader入门指南系列的第二篇,本系列面向的对象是新接触Shader开发的Unity3D使用者,因为我本身自己也是Shader初学者,因此可能会存在错误或者疏漏,如果 ...
- 【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://hpw123.net/a/C__/kongzhitaichengxu/2014/1117/120.html 作者:毛星云 ...
随机推荐
- rowid去重(删除表的重复记录)
-- 构造测试环境SQL> create table andy(id int,name varchar2(10));Table created.SQL>insert into andy v ...
- GoodReads: Machine Learning (Part 3)
In the first installment of this series, we scraped reviews from Goodreads. In thesecond one, we per ...
- 常用统计分析 SQL 在 AWK 中的实现(转)
转自:http://my.oschina.net/leejun2005/blog/100710 最近有需求需要本地处理一些临时的数据,用做统计分析.如果单纯的 MYSQL 也能实现, 不过一堆临时数据 ...
- openfire muc 移除成员
muc添加成员到数据库可参考 将Openfire中的MUC改造成类似QQ群一样的永久群 插件 插件是一位大神参考第一篇文章改进后编写的插件,进测试可以直接使用. ------------------- ...
- web—URL不同形式地址的问题
浏览网页时,不同的网站有不同的URL显示方式. 第一种形式: http://www.cnblogs.com/sylarmeng/p/6738695.html 具体的文章用数字(或组合字母)字符串来标识 ...
- wampServer 2.5 64位 更改"www 目录"不成功
已经指到自己新目录了,修改了 apache的httpd.conf里面的内容如下 修改: DocumentRoot "e:/phproot/" 修改: <Directory & ...
- WPF 简易的跑马灯效果
最近项目上要用到跑马灯的效果,和网上不太相同的是,网上大部分都是连续的,而我们要求的是不连续的. 也就是是,界面上就展示4项(展示项数可变),如果有7项要展示的话,则不断的在4个空格里左跳,当然,衔接 ...
- kotlin成长之路
前言: 从接触Kotlin开始,也就是我今天开启写技术博客的决定,文采不佳,欢迎各位阅读者的理解与指点.而该篇文章是最为博客新手的我对Kotlin成长的引导篇,所以内容一般是Kotlin技术博客的目录 ...
- 多线程异步编程示例和实践-Task
上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...
- 转发:Ubuntu软件卸载安装的命令
说明:由于图形化界面方法(如Add/Remove... 和Synaptic Package Manageer)比较简单,所以这里主要总结在终端通过命令行方式进行的软件包安装.卸载和删除的方法. 一.U ...