开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:483

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 998|回复: 10

[着色器] unity shader peoperties中的变量如何递增递减

[复制链接]  [移动端链接]
5熟悉之中
933/1000
排名
2445
昨日变化
8

9

主题

161

帖子

933

积分

Rank: 5Rank: 5

UID
174370
好友
1
蛮牛币
3364
威望
0
注册时间
2016-10-10
在线时间
297 小时
最后登录
2017-11-17

活力之星

QQ
发表于 2016-12-28 18:38:18 | 显示全部楼层 |阅读模式
10蛮牛币
在shader中设置了一个Toggle的变量,如何通过开关这个变量,可以看到shader颜色从有到无的变化过程,现状:开关Toggle,颜色要不是0,要不就是1
QQ截图20161228183756.jpg

回复

使用道具 举报

6蛮牛粉丝
1002/1500
排名
2807
昨日变化
1

11

主题

136

帖子

1002

积分

Rank: 6Rank: 6Rank: 6

UID
83836
好友
2
蛮牛币
1154
威望
0
注册时间
2015-3-24
在线时间
347 小时
最后登录
2017-11-9
QQ
发表于 2016-12-28 18:38:19 | 显示全部楼层
可以实现的 我刚刚亲测不写一句代码 仅适用shader 单击材质中的toggle cube开始渐变消失。
实现方式分享下哈
Shader "Custom/Gradual"
{
        Properties
        {
                _MainTex ("Texture", 2D) = "white" {}
                //渐变速度
                _Speed("Speed",Range(0,10)) = 0

                //toggle勾选时 开始渐变
                [Toggle] _Start("Start", Float) = 0
        }
        SubShader
        {
                Tags{ "Queue" = "Transparent" "IGNOREPROJECTOR" = "true" "RenderType" = "Transparent" }
                ZWrite Off
                LOD 100
                Blend SrcAlpha OneMinusSrcAlpha
                Pass
                {
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma multi_compile_fog
                       
                        #include "UnityCG.cginc"

                        struct appdata
                        {
                                float4 vertex : POSITION;
                                float2 uv : TEXCOORD0;
                        };

                        struct v2f
                        {
                                float2 uv : TEXCOORD0;
                                UNITY_FOG_COORDS(1)
                                float4 vertex : SV_POSITION;
                        };

                        sampler2D _MainTex;
                        float4 _MainTex_ST;
                        float _Speed;
                        float _Start;
                        v2f vert (appdata v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                                UNITY_TRANSFER_FOG(o,o.vertex);
                                return o;
                        }
                       
                        fixed4 frag (v2f i) : SV_Target
                        {
                                fixed4 tex = tex2D(_MainTex, i.uv);
                                fixed4 col;
                                UNITY_APPLY_FOG(i.fogCoord, col);
                                col.rgb = tex.rgb;
                                if (_Start == 0)
                                        col.a = tex.a;
                                else
                                        col.a = lerp(1,0,(_Time.x*_Speed)) * tex.a;                               
                                return col;                               
                        }
                        ENDCG
                }
        }
}
给cube新建材质赋给shader后,先把speed调成5,运用播放器,材质上给toggle勾上,cube就会渐变消失了

回复

使用道具 举报

排名
433
昨日变化

15

主题

331

帖子

2196

积分

Rank: 9Rank: 9Rank: 9

UID
13110
好友
10
蛮牛币
4694
威望
0
注册时间
2014-1-21
在线时间
522 小时
最后登录
2017-11-17

专栏作家认证开发者

发表于 2016-12-28 21:34:08 | 显示全部楼层
用int  【Range(0,1)】

回复

使用道具 举报

5熟悉之中
933/1000
排名
2445
昨日变化
8

9

主题

161

帖子

933

积分

Rank: 5Rank: 5

UID
174370
好友
1
蛮牛币
3364
威望
0
注册时间
2016-10-10
在线时间
297 小时
最后登录
2017-11-17

活力之星

QQ
 楼主| 发表于 2016-12-29 09:19:15 | 显示全部楼层
菠萝哥哥 发表于 2016-12-28 21:34
用int  【Range(0,1)】

可能是我没有表达清楚,我想要的效果是当我点击了Toggle(Invert Color)后,我的图片会自己从有变到无,但是我要看到这个变化的过程
1.jpg
2.jpg
3.jpg
4.jpg

回复

使用道具 举报

6蛮牛粉丝
1355/1500
排名
1621
昨日变化
1

2

主题

148

帖子

1355

积分

Rank: 6Rank: 6Rank: 6

UID
56405
好友
0
蛮牛币
2017
威望
0
注册时间
2014-11-19
在线时间
445 小时
最后登录
2017-10-25

蛮牛译员

发表于 2016-12-29 09:31:55 | 显示全部楼层
这个恐怕无法实现,因为shader里没有可保存的公共变量。当然你可以自己写编辑器,在C#里控制一个隐藏的变量来达到目的

此用户很懒,什么也没留下
回复

使用道具 举报

5熟悉之中
933/1000
排名
2445
昨日变化
8

9

主题

161

帖子

933

积分

Rank: 5Rank: 5

UID
174370
好友
1
蛮牛币
3364
威望
0
注册时间
2016-10-10
在线时间
297 小时
最后登录
2017-11-17

活力之星

QQ
 楼主| 发表于 2016-12-29 09:37:58 | 显示全部楼层
osblow 发表于 2016-12-29 09:31
这个恐怕无法实现,因为shader里没有可保存的公共变量。当然你可以自己写编辑器,在C#里控制一个隐藏的变量 ...

恩,我知道C#可以,我现在就是想看看在Shader中能不能实现一下

回复

使用道具 举报

4四处流浪
319/500
排名
6428
昨日变化
5

0

主题

42

帖子

319

积分

Rank: 4

UID
134896
好友
0
蛮牛币
398
威望
0
注册时间
2016-1-17
在线时间
119 小时
最后登录
2017-11-12
发表于 2016-12-29 13:45:43 | 显示全部楼层
Mill 发表于 2016-12-29 09:37
恩,我知道C#可以,我现在就是想看看在Shader中能不能实现一下

你在C#里获取Shader对象修改也不行吗?

回复

使用道具 举报

5熟悉之中
933/1000
排名
2445
昨日变化
8

9

主题

161

帖子

933

积分

Rank: 5Rank: 5

UID
174370
好友
1
蛮牛币
3364
威望
0
注册时间
2016-10-10
在线时间
297 小时
最后登录
2017-11-17

活力之星

QQ
 楼主| 发表于 2016-12-30 14:04:25 | 显示全部楼层
NEW小三 发表于 2016-12-29 17:59
可以实现的 我刚刚亲测不写一句代码 仅适用shader 单击材质中的toggle cube开始渐变消失。
实现方式分享下 ...

我刚测试了你这个Shader,写的挺不错的,但是运行之后我取消toggle,Cube就一下子出现了,没有渐现的效果啊

回复

使用道具 举报

6蛮牛粉丝
1002/1500
排名
2807
昨日变化
1

11

主题

136

帖子

1002

积分

Rank: 6Rank: 6Rank: 6

UID
83836
好友
2
蛮牛币
1154
威望
0
注册时间
2015-3-24
在线时间
347 小时
最后登录
2017-11-9
QQ
发表于 2016-12-30 19:03:16 | 显示全部楼层
Mill 发表于 2016-12-30 14:04
我刚测试了你这个Shader,写的挺不错的,但是运行之后我取消toggle,Cube就一下子出现了,没有渐现的效果 ...

if (_Start == 0)
       col.a = tex.a;
else
       col.a = lerp(1,0,(_Time.x*_Speed)) * tex.a;                                
return col;
请看这段代码,当_Start不为0(其实就是1)的时候col.a会受时间影响,_Time是线性递增的,所以差值后的值会从1->0,当_Start为0的时候,抱歉了,我找不到一个方法a = f(_Time.x), 在_Time还在继续增长的时候下,使a的值从0到1渐变。
其实主要的限制就是shader不能像CPU一样得去使用公共变量,所以不能用一个公共变量来保存上一次的透明度值 ,所以这个shader只能渐变一次,要么渐现,要么渐消                              

回复

使用道具 举报

5熟悉之中
933/1000
排名
2445
昨日变化
8

9

主题

161

帖子

933

积分

Rank: 5Rank: 5

UID
174370
好友
1
蛮牛币
3364
威望
0
注册时间
2016-10-10
在线时间
297 小时
最后登录
2017-11-17

活力之星

QQ
 楼主| 发表于 2016-12-31 12:10:28 | 显示全部楼层
NEW小三 发表于 2016-12-30 19:03
if (_Start == 0)
       col.a = tex.a;
else

我理解你的意思,我之前是用的_Time.y做的,就是只有一次渐隐或者是消,后来我看到还有一个unity_DeltaTime变量,以为可以用这个做出来,可是后来想了半天也没弄出来,不过还是非常感谢你!感谢!

回复

使用道具 举报

排名
25915
昨日变化
15

1

主题

15

帖子

36

积分

Rank: 1

UID
199641
好友
0
蛮牛币
15
威望
0
注册时间
2017-1-7
在线时间
10 小时
最后登录
2017-1-19
发表于 2017-1-9 20:16:35 | 显示全部楼层
很好,很强大,
很实用,赞一个

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表