Unity3D中shader 轮廓描边效果实现代码

Unity3D中shader 轮廓描边效果

想利用Unity3D中shader这个功能实现描边轮廓边框效果该怎么做呢,相信有很多搞开发的人想知道,为此下面就给大家介绍下方法。

  Shade实现描边效果,如下图中的3D球效果图

          Shade代码如下:

Shader "Outlined/Silhouetted Diffuse" {
 Properties {
 _Color ("Main Color", Color) = (1,1,1,1)
 _OutlineColor ("Outline Color", Color) = (0,0,0,1) //改变这个能改变轮廓边的颜色
 _Outline ("Outline width", Range (0.0, 0.03)) = 0.008 //改变这个能改变轮廓边的粗细
 _MainTex ("Base (RGB)", 2D) = "white" { }
 } 

CGINCLUDE
#include "UnityCG.cginc" 

struct appdata {
 float4 vertex : POSITION;
 float3 normal : NORMAL;
}; 

struct v2f {
 float4 pos : POSITION;
 float4 color : COLOR;
}; 

uniform float _Outline;
uniform float4 _OutlineColor; 

v2f vert(appdata v) {
 // just make a copy of incoming vertex data but scaled according to normal direction
 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 * o.pos.z * _Outline;
 o.color = _OutlineColor;
 return o;
}
ENDCG 

 SubShader {
 Tags { "Queue" = "Transparent" } 

 // note that a vertex shader is specified here but its using the one above
 Pass {
 Name "OUTLINE"
 Tags { "LightMode" = "Always" }
 Cull Off
 ZWrite Off
 ZTest Always
 ColorMask RGB // alpha not used 

 // you can choose what kind of blending mode you want for the outline
 Blend SrcAlpha OneMinusSrcAlpha // Normal
 //Blend One One // Additive
 //Blend One OneMinusDstColor // Soft Additive
 //Blend DstColor Zero // Multiplicative
 //Blend DstColor SrcColor // 2x Multiplicative 

CGPROGRAM
#pragma vertex vert
#pragma fragment frag 

half4 frag(v2f i) :COLOR {
 return i.color;
}
ENDCG
 } 

 Pass {
 Name "BASE"
 ZWrite On
 ZTest LEqual
 Blend SrcAlpha OneMinusSrcAlpha
 Material {
 Diffuse [_Color]
 Ambient [_Color]
 }
 Lighting On
 SetTexture [_MainTex] {
 ConstantColor [_Color]
 Combine texture * constant
 }
 SetTexture [_MainTex] {
 Combine previous * primary DOUBLE
 }
 }
 } 

 SubShader {
 Tags { "Queue" = "Transparent" } 

 Pass {
 Name "OUTLINE"
 Tags { "LightMode" = "Always" }
 Cull Front
 ZWrite Off
 ZTest Always
 ColorMask RGB 

 // you can choose what kind of blending mode you want for the outline
 Blend SrcAlpha OneMinusSrcAlpha // Normal
 //Blend One One // Additive
 //Blend One OneMinusDstColor // Soft Additive
 //Blend DstColor Zero // Multiplicative
 //Blend DstColor SrcColor // 2x Multiplicative 

 CGPROGRAM
 #pragma vertex vert
 #pragma exclude_renderers gles xbox360 ps3
 ENDCG
 SetTexture [_MainTex] { combine primary }
 } 

 Pass {
 Name "BASE"
 ZWrite On
 ZTest LEqual
 Blend SrcAlpha OneMinusSrcAlpha
 Material {
 Diffuse [_Color]
 Ambient [_Color]
 }
 Lighting On
 SetTexture [_MainTex] {
 ConstantColor [_Color]
 Combine texture * constant
 }
 SetTexture [_MainTex] {
 Combine previous * primary DOUBLE
 }
 }
 } 

 Fallback "Diffuse"
}

  以上就是Unity3D中利用shader这个功能实现描边轮廓边框效果的方法,不会的话就直接那这串代码去尝试吧。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • Unity3d获取系统时间

    Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows.Mac.Wii.iPhone.Windows pho

  • Unity3D获取当前键盘按键及Unity3D鼠标、键盘的基本操作

    获取当前键盘按键,代码如下: using UnityEngine; using System.Collections; public class GetCurrentKey : MonoBehaviour { KeyCode currentKey; void Start () { currentKey = KeyCode.Space; } void OnGUI() { if (Input.anyKeyDown) { Event e = Event.current; if (e.isKey) {

  • unity实现摄像头跟随

    代码很简单,这里就不多废话了,直接奉上代码 using UnityEngine; using System.Collections; public class FllowTarget : MonoBehaviour { public Transform character; //摄像机要跟随的人物 public float smoothTime = 0.01f; //摄像机平滑移动的时间 private Vector3 cameraVelocity = Vector3.zero; private

  • centos 6.5下 mysql-community-server. 5.7.18-1.el6安装

    使用下面的命令检查是否安装有MySQL Server [root@localhost etc]# rpm -qa | grep mysql // 这个命令就会查看该操作系统上是否已经安装了mysql数据库 有的话,我们就通过 rpm -e 命令 或者 rpm -e --nodeps 命令来卸载掉 [root@localhost ~]# rpm -e mysql // 普通删除模式 [root@localhost ~]# rpm -e --nodeps mysql // 强力删除模式,如果使用上面

  • C#中Socket与Unity相结合示例代码

    前言 初步接触了Socket,现使其与Unity相结合,做成一个简单的客户端之间可以互相发送消息的一个Test.下面话不多说了,来一起看看详细的介绍吧. 方法如下: 首先,是服务端的代码. 创建一个连接池,用于存储客户端的数量. using System; using System.Net; using System.Net.Sockets; using System.Collections; using System.Collections.Generic; namespace Server

  • Unity编辑器下重启的方法

    Unity编辑器下重启的方法 我们项目AssetBundle打包走的是全自动化流程,打包之前要进行各种资源检测,如果检测顺利通过,则进入打包,否则提示错误资源名称及路径,打包中断!有时候即使资源检测通过也会打包崩溃,初步断定是Unity的内存爆了,因为Unity在编辑器下打开工程中的资源不会释放掉,所以内存一直在占用,打包时要进行一系列资源依赖分析,我们也知道,如果资源量非常大时候,Unity要保存资源依赖的堆栈,所以会有内存崩掉的风险,所以我就想着,打包之前重启下Unity,让Unity释放掉

  • Unity3d发布IOS9应用时出现中文乱码的解决方法

    简单的说,解决方法就是批量修改NGUI的label字体,修复ios就删除arial引起的中文乱码 我们来看具体如何操作 static public void yaheifont() { uf = AssetDatabase.LoadAssetAtPath("Assets/yahei.prefab",typeof( UIFont)) as UIFont; UnityEngine.Object[] objs = Selection.GetFiltered (typeof(UnityEngi

  • Unity UGUI教程之实现滑页效果

    简介 项目需要...直接展示效果吧: 原理 使用UGUI提供的ScrollRect和ScrollBar组件实现基本滑动以及自己控制每次移动一页来达到滑页的效果. 实现过程 1.创建两个panel,上面的panel用于显示,下面的panel用于存放按钮 2.在TopPanel上添加ScrollRect脚本,用于滑动 3.在TopPanel下创建一个新的Panel,并在子Panel下拜访要显示的对象 4.将该子Panel设置为ScrollRect的活动对象 5.为ScrollRect添加Scroll

  • Unity3D中shader 轮廓描边效果实现代码

    Unity3D中shader 轮廓描边效果 想利用Unity3D中shader这个功能实现描边轮廓边框效果该怎么做呢,相信有很多搞开发的人想知道,为此下面就给大家介绍下方法. Shade实现描边效果,如下图中的3D球效果图         Shade代码如下: Shader "Outlined/Silhouetted Diffuse" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _OutlineCo

  • jQuery 中msgTips 顶部弹窗效果实现代码

    最近发现好多网站都采用顶部弹窗,并且不用用户手动去点击确定.感觉这样很方便用户,所以也找了好多大神的代码,整理一下方便以后查找 前端: @{ Layout = null; } <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns=&quo

  • Vue中实现过渡动画效果示例代码

    目录 Vue的transition动画 Transition动画的使用 Transition组件的原理 Transition动画的class Vue的animation动画 Animation动画的使用 同时设置两种动画(了解) 过渡的模式mode 列表过渡 列表过渡的介绍 列表过渡的使用 Vue的transition动画 Transition动画的使用 在开发中,我们想要给一个组件的显示和消失添加某种过渡动画,可以很好的增加用户体验: React框架本身并没有提供任何动画相关的API,所以在R

  • 在AngularJS应用中实现一些动画效果的代码

    在Angular当中,CSS和JavaScript之间唯一的区别就是它们的定义.没有什么区别妨碍到被定义的动画被使用.首先,我们需要加载ngAnimate模块到我们应用的root模块当中. angular.module('coursesApp', ['ngAnimate']); 而所有将被处理的JavaScript动画事件依然保持不变.以下是一个直接支持的动画列表和它们对应的不同行为: 指令事件集 ng-view ng-include ng-switch ng-if  enter leave n

  • jquery中实现标签切换效果的代码

    核心代码: 复制代码 代码如下: $("ul > li").hover(tab); function tab() { $(this).addClass("ll").siblings().removeClass("ll"); var tab = $(this).attr("title"); $("#" + tab).show().siblings().hide(); }; li中和title必须和div

  • mybatis中oracle实现分页效果实例代码

    首先当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序错误. 这样的问题在iBatiS中或者自定义的xml处理sql的程序中经常需要我们来处理.其实很简单,我们只需作如下替换即可避免上述的错误: 原符号  <  <=   > >=  & '  " 替换符号 < <= > >= & &a

  • 用css滤镜实现的文字描边效果的代码

    注意:当与背景图同时出现时,会出现不兼容. a { position:absolute; color:white; filter: Dropshadow(offx=1,offy=0,color=red) Dropshadow(offx=0,offy=1,color=red) Dropshadow(offx=0,offy=-1,color=red) Dropshadow(offx=-1,offy=0,color=red); } 我们 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

  • php和js编程中的延迟执行效果的代码

    php sleep(10); usleep(10); js里的 setInterval("方法", 100); PHP sleep() 函数 <?php echo date('h:i:s') . "<br />"; //暂停 10 秒 sleep(10); //重新开始 echo date('h:i:s'); ?>一个命令行(批处理)延迟执行命令的语法http://www.jb51.net/article/11381.htm

  • Unity Shader实现描边OutLine效果

    本文实例为大家分享了Unity Shader实现描边OutLine效果的具体代码,供大家参考,具体内容如下 Shader实现描边流程大致为:对模型进行2遍(2个pass)绘制,第一遍(描边pass)在vertex shader中对模型沿顶点法线方向放大,fragment shader设置输出颜色为描边颜色:第二遍正常绘制模型,除被放大的部分外,其余被覆盖,这样就有了描边的效果. 实现代码如下: Shader "Custom/OutlineShader" { Properties { _

  • Unity3D Shader实现流光效果

    本文实例为大家分享了Unity3D Shader实现流光效果的具体代码,供大家参考,具体内容如下 流光效果图: 演示工程:下载地址 //功能需求:模拟数据传送效果,高亮色块从模型上方移动到下方 //功能分析:这里采用UV动画的方式来实现,利用Alpha贴图控制流动的形状 // 利用Alpha遮罩贴图,控制模型中哪些地方需要进行流动 Shader "Custom/DataFlowEffect" { Properties { _MainColor("Main Color"

随机推荐