日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Shader相关Mask裁切UI粒子特效或者3D模型

發(fā)布時間:2024/9/30 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Shader相关Mask裁切UI粒子特效或者3D模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?

轉(zhuǎn)載自:http://www.xuanyusong.com/archives/3518

?

原理就是把Mask的裁切區(qū)域傳給粒子特效Shader,當(dāng)超出這個區(qū)域那么直接讓它完全透明即可。粒子特效的源生shader大家可以去unity官網(wǎng)下載,我在這里把需要修改的地方標(biāo)注給大家。

//add 注釋中的內(nèi)容就是我做修改的地方。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

Shader "Particles/Additive" {

Properties {

????_TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5)

????_MainTex ("Particle Texture", 2D) = "white" {}

????_InvFade ("Soft Particles Factor", Range(0.01,3.0)) = 1.0

????

????//-------------------add----------------------

??????_MinX ("Min X", Float) = -10

??????_MaxX ("Max X", Float) = 10

??????_MinY ("Min Y", Float) = -10

??????_MaxY ("Max Y", Float) = 10

??????//-------------------add----------------------

????

}

? ?

Category {

????Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }

????Blend SrcAlpha One

????AlphaTest Greater .01

????ColorMask RGB

????Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) }

????

????SubShader {

????????Pass {

????????

????????????CGPROGRAM

????????????#pragma vertex vert

????????????#pragma fragment frag

????????????#pragma multi_compile_particles

? ?

????????????#include "UnityCG.cginc"

? ?

????????????sampler2D _MainTex;

????????????fixed4 _TintColor;

????????????//-------------------add----------------------

????????????float _MinX;

????????????float _MaxX;

????????????float _MinY;

????????????float _MaxY;

????????????//-------------------add----------------------

????????????

????????????struct appdata_t {

????????????????float4 vertex : POSITION;

????????????????fixed4 color : COLOR;

????????????????float2 texcoord : TEXCOORD0;

????????????};

? ?

????????????struct v2f {

????????????????float4 vertex : SV_POSITION;

????????????????fixed4 color : COLOR;

????????????????float2 texcoord : TEXCOORD0;

????????????????#ifdef SOFTPARTICLES_ON

????????????????float4 projPos : TEXCOORD1;

????????????????#endif

????????????????//-------------------add----------------------

????????????????float3 vpos : TEXCOORD2;

????????????????//-------------------add----------------------

????????????};

????????????

????????????float4 _MainTex_ST;

? ?

????????????v2f vert (appdata_t v)

????????????{

????????????????v2f o;

????????????????//-------------------add----------------------

????????????????o.vpos = v.vertex.xyz;

????????????????//-------------------add----------------------

????????????????o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);

????????????????#ifdef SOFTPARTICLES_ON

????????????????o.projPos = ComputeScreenPos (o.vertex);

????????????????COMPUTE_EYEDEPTH(o.projPos.z);

????????????????#endif

????????????????o.color = v.color;

????????????????o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);

????????????????return o;

????????????}

? ?

????????????sampler2D_float _CameraDepthTexture;

????????????float _InvFade;

????????????

????????????fixed4 frag (v2f i) : SV_Target

????????????{

????????????????#ifdef SOFTPARTICLES_ON

????????????????float sceneZ = LinearEyeDepth (SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(i.projPos)));

????????????????float partZ = i.projPos.z;

????????????????float fade = saturate (_InvFade * (sceneZ-partZ));

????????????????i.color.a *= fade;

????????????????#endif

????????????????

????????????????//-------------------add----------------------

???????????????? fixed4 c =2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord);

???????????????? c.a *= (i.vpos.x >= _MinX );

?????????????? ???? c.a *= (i.vpos.x <= _MaxX);

???????????????? c.a *= (i.vpos.y >= _MinY);

???????????????? c.a *= (i.vpos.y <= _MaxY);

???????????????? c.rgb *= c.a;

????????????????return c;

????????????????//-------------------add----------------------

????????????}

????????????ENDCG

????????}

????}????

}

}

然后是自己寫了個類繼承Mask。把Mask的區(qū)域傳給shader
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class MyMask :Mask
{
protected override void Start ()
{
base.Start ();

int width = Screen.width;
int height = Screen.height;
int designWidth = 960;//
開發(fā)時分辨率寬
int designHeight = 640;//
開發(fā)時分辨率高
float s1 = (float)designWidth / (float)designHeight;
float s2 = (float)width / (float)height;

//目標(biāo)分辨率小于 960X640 需要計(jì)算縮放比例
float contentScale =1f;
if(s1 > s2) {
contentScale = s1/s2;
}
Canvas canvas = GameObject.Find("Canvas").GetComponent<Canvas>();
Vector2 pos;
if(RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, transform.position, canvas.camera, out pos)){
ParticleSystem [] particlesSystems = transform.GetComponentsInChildren<ParticleSystem>();
RectTransform rectTransform = transform as RectTransform;
float minX,minY,maxX,maxY;
minX = rectTransform.rect.x + pos.x;
minY = rectTransform.rect.y+ pos.y;
maxX = minX + rectTransform.rect.width ;
maxY = minY + rectTransform.rect.height;

//這里 100 是因?yàn)?/span>ugui默認(rèn)的縮放比例是100 你也可以去改這個值,但是我覺得最好別改。
foreach(ParticleSystem particleSystem in particlesSystems)
{
particleSystem.renderer.sharedMaterial.SetFloat("_MinX",minX/100/contentScale);
particleSystem.renderer.sharedMaterial.SetFloat("_MinY",minY/100/contentScale);
particleSystem.renderer.sharedMaterial.SetFloat("_MaxX",maxX/100/contentScale);
particleSystem.renderer.sharedMaterial.SetFloat("_MaxY",maxY/100/contentScale);
}
}
}
}
上面這段代碼寫的不太好,有一個更好的辦法來取Mask的裁切區(qū)域。

通過GetWorlCornets來確定裁切的區(qū)域

1

2

3

4

5

6

7

????????Vector3[] corners = new Vector3[4];

????????RectTransform rectTransform = transform as RectTransform;

????????rectTransform.GetWorldCorners (corners);

????????minX = corners [0].x;

????????minY = corners [0].y;

????????maxX = corners [2].x;

????????maxY = corners [2].y;

然后在把裁切的區(qū)域傳到shader中。

1

2

3

4

5

????????Material m = GetMaterial (renderer);

????????m.SetFloat("_MinX",minX);

????????m.SetFloat("_MinY",minY);

????????m.SetFloat("_MaxX",maxX);

????????m.SetFloat("_MaxY",maxY);

為了做到不影響美術(shù),所以美術(shù)開發(fā)特效的時候還是用以前的shader。程序在運(yùn)行中對它進(jìn)行更換,這樣可以無縫進(jìn)行切換。

如果運(yùn)行時裁切區(qū)域發(fā)生變化, 可以重寫OnRectTransformDimensionsChange()方法來重新給材質(zhì)賦新的裁切區(qū)域

1

2

3

4

5

????protected override void OnRectTransformDimensionsChange ()

????{

????????base.OnRectTransformDimensionsChange ();

????????Change ();//重新再給材質(zhì)賦裁切參數(shù)

????}

OK,如下圖所示,把粒子特效直接掛在Mask下面, 就可以進(jìn)行裁切了。。

在說一下3D模型, 理論上用上述的shader改一改就可以。 但是我還是建議3D模型用RenderTexture。比較好控制深度。

?

?

總結(jié)

以上是生活随笔為你收集整理的Shader相关Mask裁切UI粒子特效或者3D模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 强行糟蹋人妻hd中文字幕 | 亚洲天堂第一页 | 久久天天干 | 97香蕉久久夜色精品国产 | 奶水旺盛的女人伦理 | 福利一区在线观看 | 国产一区二区三区免费在线观看 | 免费午夜网站 | 一区二区三区四区五区av | 黄色永久免费网站 | 色哟哟国产精品 | 污漫网站 | 久久中文字幕人妻 | 欧美精品久久久 | 香蕉在线视频观看 | 少妇被躁爽到高潮无码文 | 成人在线综合 | 成人一区电影 | 国产我不卡 | 美国美女黄色片 | 在线免费观看www | 免费无码av片在线观看 | 精品欧美一区二区三区久久久 | 久久va| 亚洲成a人片77777kkkk | 日韩一区二区三区在线免费观看 | 中文字幕亚洲欧美日韩在线不卡 | 四虎国产在线 | 打美女白嫩屁屁网站 | 欧美另类第一页 | 国精产品一区一区三区 | 尤物在线观看 | 美女大黄网站 | 久久精品资源 | 骚视频在线观看 | 黑料视频在线 | 欧美精品99久久久 | 欧美一区二区三区公司 | 免费黄色短片 | 国产伦子伦对白视频 | 日韩黄色av | 在线观看视频99 | 成人午夜精品福利免费 | а√在线中文网新版地址在线 | 影音先锋中文字幕资源 | 国产91在线播放精品91 | 成人在线91| 亚洲精品一区二区口爆 | 操碰视频 | 日本熟妇一区二区三区 | 欧美v日本 | 久久久久久久女国产乱让韩 | 人妻奶水人妻系列 | 成人h视频在线观看 | 99在线免费观看视频 | 老司机福利院 | 精品无码黑人又粗又大又长 | av片在线观看网站 | av在线播放器| a在线免费观看 | 日本在线免费 | 国产av无码专区亚洲av麻豆 | 激情内射亚洲一区二区三区爱妻 | 大奶一区 | 韩国av一区二区三区 | 99热日韩| 亚洲欧美另类日韩 | 法国少妇愉情理伦片 | 殴美一级黄色片 | 最近更新中文字幕 | 国产女人爽到高潮a毛片 | 国产精品77 | 伊人久久综合视频 | 亚洲精品视频免费 | 狠狠干中文字幕 | 91成年人视频| jzzijzzij亚洲成熟少妇在线观看 久久久精品人妻一区二区三区 | 澳门久久久 | 精品国产AV色欲天媒传媒 | 国产一区视频在线免费观看 | 国产清纯白嫩初高中在线观看性色 | 97热视频| 秘密基地电影免费版观看国语 | 久久久久久亚洲 | 国产精品久久久 | 97影院| 自拍偷拍在线播放 | 日韩欧美猛交xxxxx无码 | 97se亚洲| 巨大胸大乳奶电影 | 99re6在线观看| 泰坦尼克号3小时49分的观看方法 | 97伊人超碰 | 亚洲黄在线 | 自拍啪啪 | 欧美一卡二卡三卡四卡 | 我和公激情中文字幕 | 午夜精品久久久久久久爽 | 亚洲精品视频在线播放 |