基本思路:Shader用两个Pass,一个渲染描边部分,一个渲染物体部分。

Pass1:剔除正面,渲染背面,把顶点延法线方向外围扩展一定宽度,用来表现描边的粗细,这部分用自己设定的颜色。

Pass2:剔除背面,渲染正面,正常渲染所看到的物体模型。

 // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'mul(UNITY_MATRIX_MVP,*)'

 Shader "xj/ModelEffect/Outline" {
Properties {
_Color ("模型颜色", Color) = (,,,)
_OutlineColor ("描边颜色", Color) = (,,,)
_Outline ("描边宽度", float) = 0.03
_MainTex ("模型贴图", 2D) = "white" {}
_AlphaTex ("Alpha (A)", 2D) = "white" {}
_intensity ("强度", float ) = 1.0
} CGINCLUDE
#include "UnityCG.cginc" struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
half2 texcoord : TEXCOORD0;
}; struct v2f {
float4 pos : SV_POSITION;
fixed4 color : COLOR;
half2 texcoord : TEXCOORD0;
}; struct basevt {
float4 pos : SV_POSITION;
half2 texcoord : TEXCOORD0;
}; sampler2D _MainTex;
sampler2D _AlphaTex;
uniform fixed _Outline;
uniform fixed4 _OutlineColor;
uniform fixed4 _Color;
fixed _intensity; v2f outline_vert(appdata v)
{
//在vertex阶段,每个顶点按照法线的方向偏移一部分,不过这种会造成近大远小的透视问题
//正确的做法是转换到投影空间下做偏移
//v.vertex.xyz += v.normal * _Outline; v2f o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal);
float2 offset = TransformViewToProjection(norm.xy);
o.pos.xy += offset * _Outline;
o.color = _OutlineColor;
o.texcoord = v.texcoord;
return o;
} fixed4 outline_frag(v2f i): SV_Target
{
fixed4 color = i.color;
color.a = tex2D(_AlphaTex, i.texcoord).a;
return color;
} basevt base_vert(appdata v)
{
basevt o;
o.pos = mul(UNITY_MATRIX_MVP,v.vertex);
o.texcoord = v.texcoord;
return o;
} fixed4 base_frag(basevt i): SV_Target
{
fixed4 col = tex2D(_MainTex, i.texcoord) * _Color * _intensity;
col.a = tex2D(_AlphaTex, i.texcoord).a * _Color.a;
return col;
}
ENDCG SubShader {
Tags { "Queue" = "Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
Fog {Mode Off} Pass
{
Name "OUTLINE"
Cull Front //剔除正面
CGPROGRAM #pragma vertex outline_vert
#pragma fragment outline_frag
#pragma fragmentoption ARB_precision_hint_fastest ENDCG
} Pass
{
Name "BASE"
Cull Back //剔除背面
CGPROGRAM #pragma vertex base_vert
#pragma fragment base_frag
#pragma fragmentoption ARB_precision_hint_fastest ENDCG
}
}
FallBack "xj/Default"
}

主角场景Shader效果:描边的更多相关文章

  1. 主角场景Shader效果:遮挡透明

    基本原理:被遮挡的部分关闭深度写入, 显示透明效果:未被遮挡的部分不关闭深度测试,显示正常贴图效果,即使用两个Pass即可. Pass1:关闭深度写入(ZWrite Off),深度测试渲染较远的物体, ...

  2. 主角场景Shader效果:光影

    基本思路:unity有一种很容易实现光影效果的神器,那就是unity自带的projector. 首先需要用到两张贴图: 一张投影需要的光圈贴图,如下: 一张根据远近距离显示暗淡的贴图(左至右,白渐变黑 ...

  3. Unity Shader实现描边效果

    http://gad.qq.com/article/detail/28346 描边效果是游戏里面非常常用的一种效果,一般是为了凸显游戏中的某个对象,会给对象增加一个描边效果.本篇文章和大家介绍下利用S ...

  4. 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画

     1 加入场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadial ...

  5. Unity3D在移动平台下加载AssetBundle导致Shader效果不正确的问题

    这个问题,主要还是在移动平台下开发导致的. 在编辑器里调试加载AB时会导致Shader效果不正确的原因,主要还是编辑器下加载以IOS或是ANDROID平台打包的AB它所使用的shader已经编译成对应 ...

  6. 小强学渲染之Unity Shader边缘描边加强

    项目开发遇到一个需求,就是当坦克的准心瞄准敌方(enemy tank 或 item box)时,要让选中的对象的轮廓高亮起来,这实际上是接下来要讲解的实时渲染中轮廓线的渲染应用.实现方式有多种,下面逐 ...

  7. Unity3D 屏幕空间雪场景Shader渲染

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解 ...

  8. 灵感闪现 篇 (一) 2d场景 3d 效果

    中途打断一下 ,框架文档的 更新. 另开一篇主题为 灵感闪现的 板块. 在工作生活中,总有发现新事物或新东西 而让自己突然 灵感闪现的时候,那么这个时候,我必须要抓住,并尽快把 这份灵感实现下来. 之 ...

  9. Unity Shader 效果(1) :图片流光效果

    很多游戏Logo中可以看到这种流光效果,一般的实现方案就是对带有光条的图片uv根据时间进行移动,然后和原图就行叠加实现,不过实现过程中稍稍有点需要注意的地方.之前考虑过风宇冲的实现方式,但是考虑到sh ...

随机推荐

  1. IOS git 删除仓库 新建仓库 提交 合并 操作 码云

    HDHaoShaoPengdeiMac:~ hdhaoshaopeng$ defaults write com.apple.finder AppleShowAllFiles TRUE HDHaoSha ...

  2. virtual box下安装ubuntu经验

    1. 哪怕下载的是ubuntu64位版本,也在vitualbox下选择ubuntu而不要选择ubuntu(64bit) 2. 安装VBoxGuestAdditional.iso:下载和vbox版本相匹 ...

  3. Alpha阶段项目展示博客

    烫烫烫烫烫(hotcode5)团队 1. 团队成员的简介和个人博客地址 刘畅 博客园ID:森高Slontia 身份:PM 个人介绍: 弹丸粉 || 小说创作爱好者 || 撸猫狂魔(x || 生命的价值 ...

  4. MySql 赋值操作符"="与":="

    MySql小点心—1.赋值操作符"="与":=" 对于刚接触到mysql的程序员来说,会对这两个符号有疑问,因为会发现有的代码里用这个有的用另一个. 当然他们是 ...

  5. Currency Exchange 货币兑换 Bellman-Ford SPFA 判正权回路

    Description Several currency exchange points are working in our city. Let us suppose that each point ...

  6. "Hello World!"团队负责人领跑衫感言

    时间:2017年12月7日 团队名称:“Hello World!” 团队项目:空天猎 团队成员:陈建宇(项目负责人).刘淑霞.黄泽宇.方铭.贾男男.刘耀泽.刘成志 感言正文: 记<软件工程> ...

  7. 读书笔记 之java编程思想

    本阶段我正在读java的编程思想这本书,这本书只是刚读了第一章的一部分,有些有些要记得所以记录下来, 我认为要记得有就是复用这样可以对对象进行增强,将一个类作为下一个类中基本类型,这样达到的服用的目的 ...

  8. Python入门:学会创建并调用函数

    这是关于Python的第4篇文章,主要介绍下如何创建并调用函数. print():是打印放入对象的函数 len():是返回对象长度的函数 input():是让用户输入对象的函数 ... 简单来说,函数 ...

  9. 在Delphi中获得唯一32位长字符串

    function GetGUID: string; var   vGUID: TGUID;   vTemp:string; begin   if S_OK = CreateGuid(vGUID) th ...

  10. JS单例模式在工作中的使用

    为了尽可能的减少全局变量的污染,在写js的时候可以采用单例模式,形式如下: 比如有一个js叫demo.js,那么我们可以在js里这样写: var demo = {} 这样做的目的是将整个js当成一个对 ...