基本思路: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. shell--read命令

    read命令 -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后,read命令将数 ...

  2. 将eclipse上的web项目部署到Tomcat服务器上经验总结

    1.  将Tomcat插件添加到eclipse上 Window --> Preferences --> Server --> Runtime Environment --> A ...

  3. vim搭建C编程IDE

    曾经在一篇关于vim技巧的文章里有一句话:"世界上只有三种编辑器,EMACS.VIM和其它." 我不知道这是不是太过于绝对了,但是从我所看到的每一篇linux下编程以及文字编辑的文 ...

  4. MAX值-单元测试

    #include<iostream> using namespace std; int Largest(int list[], int length); // list[]:求最大值的函数 ...

  5. Task 6.2站立会议二

    今天,我们开始自己开始编译运行代码了,服务器端,聊天界面的相关代码经过测试.大家都把自己的实验过程公布了,大家的交流对实验的进度也起到了很大的作用.明天我们要继续修改实验中的错误,然后大家一起把实验基 ...

  6. Java基础第一节.Java简介

    第一节 Java简介 Java是一个由Sun公司开发而成的新一代的编程语言. Java语言是对软件开发有深远影响.应用前景广泛.具有丰富的类库.继承了C++的传统(摈弃了某些不足)广泛使用的网络编程语 ...

  7. UVA - 11021 Tribles 概率dp

    题目链接: http://vjudge.net/problem/UVA-11021 Tribles Time Limit: 3000MS 题意 有k只麻球,每只活一天就会死亡,临死之前可能会出生一些新 ...

  8. 牛客网国庆集训派对Day4题目 2018年

    链接:https://www.nowcoder.com/acm/contest/204/A来源:牛客网 深度学习 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他 ...

  9. 关于supervisor无法监控golang代码的解决方法

    之前一直都是使用如下方式运行go代码 # go run test.go 这种运行方式是直接编译运行go代码,虽然在调试的时候没出什么问题,但是在使用supervisor监控的时候,会提示如下错误:(b ...

  10. oracle 简单的sysTimeStamp类型转date 类型

    oracle  简单的SYSTIMESTAMP 类型转date 类型 SELECT SYSTIMESTAMP , SYSTIMESTAMP+0 FROM dual; SAMPLE_TIME ----- ...