标题光效

标题光效是一种常见的图片特效,“遮罩层”从左往右经过,起到强调游戏标题的作用,如下图所示。那么怎样用Shader实现这种效果呢?
 


By 知乎@罗培羽

1、编写Shader

下面的着色器代码使用了顶点/片元着色器处理标题光效功能。这里定义4个属性,其中_MainTex代表图片贴图,_MaskColor代表遮罩颜色,Speed代表光效的移动速度,_MaskLimit控制着光效的宽度。核心代码为“float isMask = sin(_Time.y*_Speed  -i.uv.x*2*PI );”“isMask = step(_MaskLimit,isMask);”“c.rgb += _MaskColor*isMask;”这3句。如果isMask为1,代表该片元被遮罩,如果为0,表示不被遮罩,通过“c.rgb += _MaskColor*isMask;”便可计算片元的颜色。“float isMask = sin(_Time.y*_Speed -i.uv.x*2*PI );”将根据时间和uv的x坐标计算isMask,此时isMask的取值范围为[-1,1]。step(_MaskLimit,isMask)的功能相当于“if(isMask > MaskLimit) return 1; else return 0;”通过_MaskLimit将指定区间的值设为1,其他设为0。

[C#]  纯文本查看  复制代码
?
 
01
02
03
04
05
06
07
08
09
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
Shader "Lpy/ImageEffect"
{
     Properties
     {
         _MainTex ( "Main Tex" , 2D) = "white" {}
         _MaskColor ( "Mask Color" , Color) = (1, 1, 1, 1)
         
         _Speed ( "Speed" , float ) = 2
         _MaskLimit ( "MaskLimit" , float ) = 0.8
     }
     
     SubShader
     {
         Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
         
         Pass
         {
             Tags { "LightMode" = "ForwardBase" }
             ZTest off
             ZWrite Off
             Blend SrcAlpha OneMinusSrcAlpha
             
             CGPROGRAM
             #pragma vertex vert 
             #pragma fragment frag
             #include "UnityCG.cginc"
             #define PI 3.14159265358979 
             
             
             sampler2D _MainTex;
             fixed3 _MaskColor;
             float _Speed;
             float _MaskLimit;
             
             struct a2v
            
                 float4 vertex : POSITION;
                 float3 texcoord : TEXCOORD0;
             }; 
             
             struct v2f
            
                 float4 pos : SV_POSITION;
                 float2 uv : TEXCOORD0;
             }; 
             
             v2f vert (a2v v)
            
                 v2f o; 
                 o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 
                 o.uv = v.texcoord;
                 return o;
            
             
             fixed4 frag (v2f i) : SV_Target
             {
                 fixed4 c = tex2D(_MainTex, i.uv);
                 
                 float isMask = sin(_Time.y*_Speed  -i.uv.x*2*PI );
                 isMask = step(_MaskLimit,isMask);
                 
                 c.rgb += _MaskColor*isMask;
                 return c;
             }
             ENDCG
        
     }
     FallBack "Transparent/VertexLit"
}



2、使用材质
新建一个名为ImageEffect的材质,选择上述编写的shader。设置MaskColor、Speed、MaskLimit这3个参数,如下图所示。
 


将刚创建的材质应用于图片上,即可看到效果。如下图所示。

 

(转自蛮牛)

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
很高兴为您解答。下面是一个使用Python和Pygame库绘制粒子光效圣诞树的示例代码: ```python import pygame import random # 初始化Pygame pygame.init() # 设置窗口大小和标题 size = (800, 600) screen = pygame.display.set_mode(size) pygame.display.set_caption("Particle Christmas Tree") # 定义颜色 WHITE = (255, 255, 255) GREEN = (0, 255, 0) RED = (255, 0, 0) # 定义粒子类 class Particle(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface([4, 4]) self.image.fill(WHITE) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.change_x = random.randrange(-3, 4) self.change_y = random.randrange(-3, 4) self.life = 60 def update(self): self.rect.x += self.change_x self.rect.y += self.change_y self.life -= 1 if self.life == 0: self.kill() # 定义粒子组 all_sprites_list = pygame.sprite.Group() # 定义主循环 done = False clock = pygame.time.Clock() while not done: for event in pygame.event.get(): if event.type == pygame.QUIT: done = True # 绘制圣诞树 screen.fill(GREEN) pygame.draw.rect(screen, BROWN, [375, 500, 50, 100]) pygame.draw.polygon(screen, GREEN, [[275, 500], [475, 500], [375, 350]]) pygame.draw.polygon(screen, GREEN, [[250, 450], [500, 450], [375, 300]]) pygame.draw.polygon(screen, GREEN, [[225, 400], [525, 400], [375, 250]]) # 生成粒子 if random.randrange(0, 10) == 0: particle = Particle(375, 250) all_sprites_list.add(particle) # 更新粒子 all_sprites_list.update() # 绘制粒子 all_sprites_list.draw(screen) # 更新屏幕 pygame.display.flip() clock.tick(60) # 退出Pygame pygame.quit() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值