UIEmoji与设计思路

此shader需和EmojiText配合使用

主要设计原理是重写 protected override void OnPopulateMesh(VertexHelper vertex)函数

改变里面的UV坐标,文字的坐标设计为小于等于0.5,表情符则大于0.5。在shader中则小等0.5时取_MainTex纹理的像素,大于则取_emoji纹理中的像素,实际效果请看我Unity3D多线程UI

Shader "Custom/UIEmoji"

{

Properties

{

_emoji("Sprite Texture", 2D) = "white" {}

[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}

_Color("Tint", Color) = (1,1,1,1)

_StencilComp("Stencil Comparison", Float) = 8

_Stencil("Stencil ID", Float) = 0

_StencilOp("Stencil Operation", Float) = 0

_StencilWriteMask("Stencil Write Mask", Float) = 255

_StencilReadMask("Stencil Read Mask", Float) = 255

_ColorMask("Color Mask", Float) = 15

[Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip("Use Alpha Clip", Float) = 0

}

SubShader

{

Tags

{

"Queue" = "Transparent"

"IgnoreProjector" = "True"

"RenderType" = "Transparent"

"PreviewType" = "Plane"

"CanUseSpriteAtlas" = "True"

}

Stencil

{

Ref[_Stencil]

Comp[_StencilComp]

Pass[_StencilOp]

ReadMask[_StencilReadMask]

WriteMask[_StencilWriteMask]

}

Cull Off

Lighting Off

ZWrite Off

ZTest[unity_GUIZTestMode]

Blend SrcAlpha OneMinusSrcAlpha

ColorMask[_ColorMask]

Pass

{

Name "Default"

CGPROGRAM

#pragma vertex vert

#pragma fragment frag

#pragma target 2.0

#include "UnityCG.cginc"

#include "UnityUI.cginc"

#pragma multi_compile __ UNITY_UI_ALPHACLIP

struct appdata_t

{

float4 vertex  : POSITION;

float4 color    : COLOR;

float2 texcoord : TEXCOORD0;

UNITY_VERTEX_INPUT_INSTANCE_ID

};

struct v2f

{

float4 vertex  : SV_POSITION;

float4 color : COLOR;

float2 texcoord  : TEXCOORD0;

float4 worldPosition : TEXCOORD1;

UNITY_VERTEX_OUTPUT_STEREO

};

fixed4 _Color;

fixed4 _TextureSampleAdd;

float4 _ClipRect;

v2f vert(appdata_t IN)

{

v2f OUT;

UNITY_SETUP_INSTANCE_ID(IN);

UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);

OUT.worldPosition = IN.vertex;

OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);

OUT.texcoord = IN.texcoord;

OUT.color = IN.color * _Color;

return OUT;

}

sampler2D _MainTex;

sampler2D _emoji;

fixed4 frag(v2f IN) : SV_Target

{

half4 color;

if (IN.texcoord.x > 0.5)

{

IN.texcoord.x -= 0.5;

IN.texcoord.x *= 2;

color = tex2D(_emoji, IN.texcoord);

color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);

}

else {

IN.texcoord.x *= 2;

color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd);

color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);

color.xyz = IN.color.xyz;

#ifdef UNITY_UI_ALPHACLIP

clip(color.a - 0.001);

#endif

    }

return color;

}

ENDCG

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容