2013-02-21 15:33:11 fzhlee 阅读数 9588

轮廓描边是游戏中的细节  但是一个有特色的效果还是会让人眼前一亮,Glow + Outline 的效果就像求生之路2和暗黑3的轮廓描边界一样  对轮廓描边后再进行模糊处理

Unity3d  Glow + Outline 轮廓描边 - 重庆unity3d - unity3d工作室

在unity3d中的实现
1、场景图像渲染之前
 void OnPreRender
{
  ......
   另外添加一个摄像机A
  这里必须将GlowOutlineCamera摄像机关闭
  并且清除标识为纯色
  制定其渲染目标为RTT 
  清空其背景
  摄像机A在主摄像机渲染之前通过Shader去绘制指定渲染类型的GameObject   也就是需要描边的GameObject
  (即摄像机A.RenderWithShader(RTT, "XXXX");)
  ...... 
}
 
2、场景图像渲染之后 
void OnRenderImage(RenderTexture source, RenderTexture destination)
{
  ......
  将摄像机A所渲染的目标纹理进行blur处理
  将blur后的RTT与场景图像渲染后的RTT进行合成叠加
  拷贝到目的渲染纹理上
  ......
}
效果
Unity3d  Glow + Outline 轮廓描边 - 重庆unity3d - unity3d工作室
2019-03-22 10:39:08 u012740992 阅读数 2385

在unity的ugui的用于Text描边的组件outline中,其中的实现是将字体copy出几份往外放置形成背景黑边,随之带来的是性能的高消耗。如果是一两个Text描边还好,如果同屏有大量Text在使用其在描边时,其性能消耗提高十分明显,甚至直接影响到了游戏FPS。
因此,同屏Text描边多时有必要优化一下,因此写一个可以实现Text描边的shader。
一样的道理,shader中有2个Pass,但多个Text在使用其描边时,Unity会自动进行批处理,所以整体上只会多出一个drawcall,相比ugui内置的outline组件,此shader性能提升巨大,效果明显!

用法: 1,导入此TextOutline.shader,

2,Project视窗下右键Create->Material,命名为TextOutline,然后它选中在 Inspector视窗中最上端Shader属性选择Custom->TextOutline。

3,将2步骤的TextOutline Material赋给需要描边的ugui Text控件即可。

效果:

在这里插入图片描述

代码:

TextOutline.shader :


Shader "Custom/TextOutline" {
	Properties{
		_MainTex("Font Texture", 2D) = "white" {}
		_Color("Text Color", Color) = (1,1,1,1)
		_OutlineColor("Outline Color", Color) = (0,0,0,1)
		_StencilComp("Stencil Comparison", Float) = 3.000000
		 _Stencil("Stencil ID", Float) = 1.000000
		 _StencilOp("Stencil Operation", Float) = 0.000000
		 _StencilWriteMask("Stencil Write Mask", Float) = 0.000000
		 _StencilReadMask("Stencil Read Mask", Float) = 1.000000
	}

		SubShader{

			Tags {
				"Queue" = "Transparent"
				"IgnoreProjector" = "True"
				"RenderType" = "Transparent"
				"PreviewType" = "Plane"
			}

			Lighting Off Cull Off ZTest Always ZWrite Off
			Blend SrcAlpha OneMinusSrcAlpha
			Stencil {
				Ref[_Stencil]
				ReadMask[_StencilReadMask]
				WriteMask[_StencilWriteMask]
				Comp[_StencilComp]
				Pass[_StencilOp]
			}
			//ColorMask[_ColorMask]

			//第一个Pass,实现Text内容背景颜色,并向外扩大_OutlineWidth
			Pass {
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#pragma multi_compile _ UNITY_SINGLE_PASS_STEREO STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON
				#include "UnityCG.cginc"

				struct appdata_t {
					float4 vertex : POSITION;
					fixed4 color : COLOR;
					float2 texcoord : TEXCOORD0;
					//UNITY_VERTEX_INPUT_INSTANCE_ID
				};

				struct v2f {
					float4 vertex : SV_POSITION;
					fixed4 color : COLOR;
					float2 texcoord : TEXCOORD0;
					UNITY_VERTEX_OUTPUT_STEREO
				};

				sampler2D _MainTex;
				uniform float4 _MainTex_ST;
				uniform float4 _MainTex_TexelSize;
				uniform fixed4 _Color;
				uniform fixed4 _OutlineColor;


				v2f vert(appdata_t v)
				{
					v2f o;
					UNITY_SETUP_INSTANCE_ID(v);
					UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
					o.vertex = UnityObjectToClipPos(v.vertex);
					o.color = v.color * _Color;
					o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
					return o;
				}
				//确定每个像素周围8个像素的坐标。
				static const float2 dirList[9] = {
					float2(-1,-1),float2(0,-1),float2(1,-1),
					float2(-1,0),float2(0,0),float2(1,0),
					float2(-1,1),float2(0,1),float2(1,1)
				};
				//谋取dirList第dirIndex个方位的透明度值。
				float getDirPosAlpha(float index, float2 xy) {
					float2 curPos = xy;
					float2 dir = dirList[index];
					float2 dirPos = curPos + dir * _MainTex_TexelSize.xy * 0.6;
					return tex2D(_MainTex, dirPos).a;
				};
				//对于每个像素,传入片元参数v2f i ,获取次像素周围和自身的共9个像素进行透明度叠加。
				//那么得出的结果就是非透明的区域被放大了,形成了黑边。
				float getShadowAlpha(float2 xy) {
					float a = 0;
					float index = 0;
					a += getDirPosAlpha(index, xy);
					a += getDirPosAlpha(index++, xy);
					a += getDirPosAlpha(index++, xy);
					a += getDirPosAlpha(index++, xy);
					a += getDirPosAlpha(index++, xy);
					a += getDirPosAlpha(index++, xy);
					a += getDirPosAlpha(index++, xy);
					a += getDirPosAlpha(index++, xy);
					a += getDirPosAlpha(index++, xy);
					a = clamp(a,0,1);
					return a;
				}


				//由于渲染Text内容时,Text字上没有被渲染的区域是透明的,也就是透明度a值是0,
				//所以只要将有内容的区域往外透明度为0的区域扩展一些像素将就能够形成描边效果。
				fixed4 frag(v2f i) : SV_Target
				{
					fixed4 col = _OutlineColor;
					float2 xy = i.texcoord.xy;
					col.a *= getShadowAlpha(xy);
					return col;
				}
				ENDCG
			}
			//第二个Pass,常规渲染Text内容。

			Pass {
				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				#pragma multi_compile _ UNITY_SINGLE_PASS_STEREO STEREO_INSTANCING_ON STEREO_MULTIVIEW_ON
				#include "UnityCG.cginc"

				struct appdata_t {
					float4 vertex : POSITION;
					fixed4 color : COLOR;
					float4 texcoord : TEXCOORD0;
					//UNITY_VERTEX_INPUT_INSTANCE_ID
				};

				struct v2f {
					float4 vertex : SV_POSITION;
					fixed4 color : COLOR;
					float2 texcoord : TEXCOORD0;
					UNITY_VERTEX_OUTPUT_STEREO
				};

				sampler2D _MainTex;
				uniform float4 _MainTex_ST;
				uniform float4 _MainTex_TexelSize;
				uniform fixed4 _Color;

				v2f vert(appdata_t v)
				{
					v2f o;
					UNITY_SETUP_INSTANCE_ID(v);
					UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
					o.vertex = UnityObjectToClipPos(v.vertex);
					o.color = v.color * _Color;
					step(v.texcoord, v.vertex.xy);
					o.texcoord = TRANSFORM_TEX(v.texcoord.xy,_MainTex);
					return o;
				}
				fixed4 frag(v2f i) : SV_Target
				{
					fixed4 col = i.color;
					col.a = tex2D(_MainTex, i.texcoord).a;
					return col;
				}
				ENDCG
			}
		}
}



2013-03-25 10:39:02 Const1115 阅读数 3743

在mmo项目开发过程中,不可避免的要实现描边与遮挡效果。

把这2个放在一起说,是因为实现的方式相同(不是shader相同)。

在一开始实现的过程中,描边就是直接写一个描边的shader来做。人物被选中的时候,就把人物的材质换掉,换成描边shader,鼠标移开时候,在还原之前的shader。这样是可以实现描边。unity中,表现各种渲染效果都是通过换材质来实现的。但是项目中难免出现各种材质,精英怪与普通怪的表现不一样,难道就要为了一个描边写出每个材质对应的描边材质?这样对项目日后的管理增加了难度,以后每写一个新的人物shader,都要对应的写一个描边效果。有没有一劳永逸的方法呢。把描边和换材质分开?

再看被遮挡效果。策划那边是想实现火炬之光那样的遮挡效果,怎么实现呢。人物mesh绘制两遍,第一遍ZTest 为 Greater, ZWrite off,第二遍正常绘制即可。如果人物是一个mesh就还好说,2个shader中2 个 pass就能实现。但是如果是多个mesh拼接的人物,2个pass就出出现问题。

最后使用多个camera来绘制,解决了这个问题。

实现如下:

每个camera实际上都和场景中的main camera一样(位置,旋转,各个参数)。只是他们各自的cullmask不一样。也就是绘制的东西不一样。

最开始,我先使用第一个camera 渲染场景(建筑),第二个相机渲染需要被遮挡效果的人物,第三个相机渲染人物描边效果,第四个相机正常渲染人物。是可以正常实现想要的结果,但是人物和场景分开相机渲染会造成场景中看不到人物的阴影。

所以最后只能把人物和场景放在一起渲染。

首先,maincamera绘制全部场景,人物。然后第二个camera绘制描边的人物,第三个camera清空场景的深度信息,然后使用Camera.RenderwithShader()绘制遮挡物的深度信息(遮挡物可以让美术在场景中标记,使用layer来标记),第四个camera绘制需要实现被遮挡效果的人物,一样使用Camera.RenderwithShader()。

2020-01-19 10:37:45 weixin_44328367 阅读数 7

下载安装包后 导入到Unity中

找到脚本 QuickOutline
在这里插入图片描述
将此脚本挂到需要描边的物体上
在这里插入图片描述
组件介绍:
Outline Mode 默认选择全部 outline All
Outline Color 描边颜色
Outline Width 描边的宽度 粗细

点击下载百度网盘插件链接
提取码:gic3

欢迎使用 转载 后续问题请留言 谢谢~

2019-09-22 14:05:19 fengliaoai 阅读数 12352

每周更新unity3d视频教程,从入门到就业,官方unity3d培训,上千门实时更新课程,供学员在线观看学习,unity3d游戏开发,可以让学员随时随地学习!
免费网上学习unity3d自学教程,国内名师机构专业授课,O基础快速学习,1小时快速入门,7天unity3d自学教程学习,能力快速提升,优质作品随手呈现!

unity3d菜鸟自学教程介绍

unity3d难学吗?

unity3d自学教程目录

unity3d视频教程百度网盘下载

unity3d难学吗?
学习unity3d特效,多来学习路线网看教程,一线游戏特效老师,游戏特效就业安排!学习unity3d特效入门+进阶+精通选择专业才能学得专业!

unity3d自学教程目录
课程介绍:
Unity3d史诗 MMO ARPG 课程《泰斗破坏神》,精心设计将包含200+课时,由视频课时+直播课时+测试课时混合组成。最重头unity3d ARGP课程,完整的 ARPG 网络游戏开发教学。包含多人合作,在线多人游戏开发,角色创建系统,作战系统,RPG系统,技能系统,任务系统,商店系统。

课程大纲:

单机版功能实现

项目概要
登录系统
角色创建、选择、自定义系统
场景加载与游戏存储记录
角色控制
聊天通讯
游戏AI
战斗系统
游戏角色与玩家信息系统
商店系统
道具系统
装备系统
装备与道具掉落
仓库与背包系统
副本系统
任务系统
地图与寻路系统

网络版功能实现

服务端搭建
登录系统
角色选择
游戏场景
聊天功能
角色具体信息
商店系统
道具系统
装备系统
仓库和背包
副本系统
任务系统

unity3d视频教程百度网盘下载
http://www.xuexiluxian.net/unity3d-cainiao-zixue.html

Unity3d描边框效果

阅读数 1586

Unity描边[Unity Shader]

阅读数 6769

没有更多推荐了,返回首页