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

扫一扫,访问微社区

蛮牛译馆

关注:537

当前位置:游戏蛮牛 技术专区 蛮牛译馆

查看: 3552|回复: 18

[Unity教程] 3D打印机shader特效简单实现

[复制链接]  [移动端链接]
排名
2901
昨日变化
1

3

主题

150

帖子

830

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
103594
好友
0
蛮牛币
1804
威望
0
注册时间
2015-5-27
在线时间
316 小时
最后登录
2017-6-22
QQ
发表于 2016-11-22 14:14:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 naixiaoxian 于 2016-11-22 14:14 编辑

                                     3D打印机shader特效简单实现


参考了neosuo的帖子,然后整合了一下上下两部分的帖子按照帖子的代码自己写了一份基本没有多大出入的shader。跟例子一样实现了大部分效果,但是在scene视图下水波纹状的曲面动画功能上还是没有实现,去找了作者的源文档也没有发现对应的代码,鉴于自身水平有限,然后把demo放出来,希望大家可以抽空研究一下作者的文档,部分没有实现的功能如果有水平也可以尝试着实现一下。
新建一个surfaceshader,然后按照教程的步骤以此往下堆代码,但是在

[C#] 纯文本查看 复制代码
#pragma surface surf Unlit fullforwardshadows
inline half4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten)
{
        return _ConstructColor;
}



这部分会报错,如果再这里用了LightingUnlit 来计算定点的话好像在Standard中不支持。作者的源网址是跟我出现了一样的错误,但是那哥们儿解决了。。。方法是把#pragma里面的语句Standard变成Custom。。。可是我按照他的办法来还是报错啊 (悲剧脸)
         1.jpg
However如果直接跳过这部分的运算过程,直接按照教程走下去的话。效果基本实现
长这样
2.png

上面的波纹之所以出现是因为shader里面加了
float s = +sin((IN.worldPos.x*IN.worldPos.z)*60+_Time[3]+o.Normal)/120;


然后看上去cube里面是黑色的话其实由两部分原因,
3.png
首先是加了CULL off ,cull off 意思是双面渲染,如果不加就会这样
4.png

至于为什么变成黑色我也不大清楚- -个人觉得应该是跟 viewDir 有关
然后最后的效果类似这样子


5.png

下面是简化版的3Dprinter.shader 代码,如果有问题还请各位及时指正

效果类似这样子

1.gif
     
[C#] 纯文本查看 复制代码
Shader "Custom/3Dprinter1" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0

        _ConstructY("constructY" ,float) = 1
        _ConstructGap("constructGap",float ) = 1 
        _ConstructColor("constructColor",Color) = (0.5,0.5,0.5,0.5)
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        Cull Off
        CGPROGRAM        
        #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0

        sampler2D _MainTex;
        float _ConstructY;
        fixed4 _ConstructColor;
        float _ConstructGap;
        float3 viewDir;
        int building;

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        struct Input {
            float2 uv_MainTex;
            float3 worldPos;
            float3 viewDir;
        };

        void surf (Input IN, inout SurfaceOutputStandard o){
            viewDir = IN.viewDir;
            float s = +sin((IN.worldPos.x*IN.worldPos.z)*60+_Time[3]+o.Normal)/120;
            if (IN.worldPos.y > _ConstructY + _ConstructGap +s)
                discard;
            if(IN.worldPos.y<_ConstructY){
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
            building = 0;
            }
            else{
            o.Albedo = _ConstructColor.rgb;
            o.Alpha = _ConstructColor.a;
            building = 1;
            }
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
        }



        inline void LightingCustom_GI(SurfaceOutputStandard s, UnityGIInput data,inout UnityGI gi){
            LightingStandard_GI(s,data,gi);
        }

        inline half4 LightingCustom(SurfaceOutputStandard s,half3 lightDir,UnityGI gi){
            if(building)
                return _ConstructColor;
            if(dot(s.Normal,viewDir)>0)
                return _ConstructColor;
            return LightingStandard(s,lightDir,gi);
        }


        ENDCG

    }

    FallBack "Diffuse"
} 

相关文档的飞机票
作者
Alan Zucconihttp://www.alanzucconi.com/2016/10/02/3d-printer-shader-effect-part-1/

译者 neosuo
http://www.manew.com/thread-97463-1-1.html

155547iluo7umxezrb2ekr.png






3dprinterDemo.rar

25.52 KB, 下载次数: 128


回复

使用道具 举报

排名
7465
昨日变化
4

174

主题

211

帖子

1215

积分

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

UID
159865
好友
9
蛮牛币
2703
威望
0
注册时间
2016-8-1
在线时间
580 小时
最后登录
2017-6-19

蛮牛译员

发表于 2016-11-22 14:37:38 | 显示全部楼层
好文章!顶!

回复

使用道具 举报

5熟悉之中
771/1000
排名
2886
昨日变化
14

0

主题

148

帖子

771

积分

Rank: 5Rank: 5

UID
152953
好友
0
蛮牛币
458
威望
0
注册时间
2016-6-23
在线时间
261 小时
最后登录
2017-6-23
发表于 2016-11-22 15:30:14 | 显示全部楼层
66666666666666666666

回复 支持 反对

使用道具 举报

排名
18074
昨日变化
21

0

主题

11

帖子

49

积分

Rank: 1

UID
185805
好友
1
蛮牛币
64
威望
0
注册时间
2016-11-22
在线时间
20 小时
最后登录
2017-2-21
发表于 2016-11-23 08:42:09 | 显示全部楼层
inline void LightingCustom_GI(SurfaceOutputStandard s, UnityGIInput data,inout UnityGI gi)


UnityGI只有Unity5,0以上才支持,所以这个shader只能在Unity5.+才可以使用
[发帖际遇]: Winder灬晓东 乐于助人,奖励 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

排名
18074
昨日变化
21

0

主题

11

帖子

49

积分

Rank: 1

UID
185805
好友
1
蛮牛币
64
威望
0
注册时间
2016-11-22
在线时间
20 小时
最后登录
2017-2-21
发表于 2016-11-23 08:56:41 | 显示全部楼层
而且你把光照功能都关掉了,再去使用GI处理实时光照也没什么用了,所以你的模型看起来跟没没有光照效果了
[发帖际遇]: Winder灬晓东 被钱袋砸中进医院,看病花了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

7日久生情
2356/5000
排名
258
昨日变化
1

7

主题

433

帖子

2356

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
2795
好友
31
蛮牛币
7603
威望
0
注册时间
2013-8-29
在线时间
458 小时
最后登录
2017-6-20

社区QQ达人

发表于 2016-11-23 09:21:32 | 显示全部楼层
很好很强大,支持一下~~~

回复 支持 反对

使用道具 举报

排名
2901
昨日变化
1

3

主题

150

帖子

830

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
103594
好友
0
蛮牛币
1804
威望
0
注册时间
2015-5-27
在线时间
316 小时
最后登录
2017-6-22
QQ
 楼主| 发表于 2016-11-23 09:21:49 | 显示全部楼层
Winder灬晓东 发表于 2016-11-23 08:42
inline void LightingCustom_GI(SurfaceOutputStandard s, UnityGIInput data,inout UnityGI gi)

这个我知道。我在4.0上面写过。只是按照教程写的时候不知道是dot还是哪里出了问题不能实现光照的时候中间的截面被填满的效果。论坛里面还有个哥们写的4.7的版本的确实是可以。但是我按照教程就是走不出来也不知道是什么地方出了问题。把他那个扒下来好好研究研究- -

回复 支持 反对

使用道具 举报

排名
2901
昨日变化
1

3

主题

150

帖子

830

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
103594
好友
0
蛮牛币
1804
威望
0
注册时间
2015-5-27
在线时间
316 小时
最后登录
2017-6-22
QQ
 楼主| 发表于 2016-11-23 09:23:42 | 显示全部楼层
Winder灬晓东 发表于 2016-11-23 08:56
而且你把光照功能都关掉了,再去使用GI处理实时光照也没什么用了,所以你的模型看起来跟没没有光照效果了{: ...

所以如果要用GI的话应该把光照然后lighting里面的bake都打开对么?

回复 支持 反对

使用道具 举报

排名
2901
昨日变化
1

3

主题

150

帖子

830

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
103594
好友
0
蛮牛币
1804
威望
0
注册时间
2015-5-27
在线时间
316 小时
最后登录
2017-6-22
QQ
 楼主| 发表于 2016-11-23 09:39:02 | 显示全部楼层
Winder灬晓东 发表于 2016-11-23 08:56
而且你把光照功能都关掉了,再去使用GI处理实时光照也没什么用了,所以你的模型看起来跟没没有光照效果了{: ...

我把Unlit改成Costom然后一步一步改错好像可以了。。。
就是不清楚为什么5.0里面用不了Unlit 不是很习惯U3D的surface shader。。。


[C#] 纯文本查看 复制代码
Shader "Custom/3Dprinter1" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0

		_ConstructY("constructY" ,float) = 1
		_ConstructGap("constructGap",float ) = 1 
		_ConstructColor("constructColor",Color) = (0.5,0.5,0.5,0.5)
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		Cull Off
		CGPROGRAM		
		#pragma surface surf Custom fullforwardshadows
		#pragma target 3.0

		sampler2D _MainTex;
		float _ConstructY;
		fixed4 _ConstructColor;
		float _ConstructGap;
		float3 viewDir;
		int building;

		half _Glossiness;
		half _Metallic;
		fixed4 _Color;

		struct Input {
			float2 uv_MainTex;
			float3 worldPos;
			float3 viewDir;
		};

		void surf (Input IN, inout SurfaceOutput o){
			viewDir = IN.viewDir;
			float s = +sin((IN.worldPos.x*IN.worldPos.z)*60+_Time[3]+o.Normal)/120;
			if (IN.worldPos.y > _ConstructY + _ConstructGap +s)
				discard;
			if(IN.worldPos.y<_ConstructY){
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			o.Alpha = c.a;
			building = 0;
			}
			else{
			o.Albedo = _ConstructColor.rgb;
			o.Alpha = _ConstructColor.a;
			building = 1;
			}
			//o.Metallic = _Metallic;
			//o.Smoothness = _Glossiness;
		}



		inline void LightingCustom_GI(SurfaceOutput s, UnityGIInput data,inout UnityGI gi){
			//LightingCustom_GI(s,data,gi);
		}

		inline half4 LightingCustom(SurfaceOutput s,half3 lightDir,UnityGI gi){
			if(building)
				return _ConstructColor;
			if(dot(s.Normal,viewDir)<0)
				return _ConstructColor;

                return _Color;
		}


		ENDCG

	}

	FallBack "Diffuse"
}

回复 支持 反对

使用道具 举报

排名
18074
昨日变化
21

0

主题

11

帖子

49

积分

Rank: 1

UID
185805
好友
1
蛮牛币
64
威望
0
注册时间
2016-11-22
在线时间
20 小时
最后登录
2017-2-21
发表于 2016-11-23 14:55:57 | 显示全部楼层
naixiaoxian 发表于 2016-11-23 09:21
这个我知道。我在4.0上面写过。只是按照教程写的时候不知道是dot还是哪里出了问题不能实现光照的时候中间 ...

你说的那哥们就是我。。。。我换了马甲了 哈哈

回复 支持 反对

使用道具 举报

5熟悉之中
725/1000
排名
2343
昨日变化
8

1

主题

39

帖子

725

积分

Rank: 5Rank: 5

UID
95949
好友
0
蛮牛币
1220
威望
0
注册时间
2015-4-27
在线时间
243 小时
最后登录
2017-6-22
发表于 2016-11-24 10:15:37 | 显示全部楼层
好棒啊 可以拿币

回复

使用道具 举报

7日久生情
1793/5000
排名
1087
昨日变化

3

主题

382

帖子

1793

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
46577
好友
1
蛮牛币
2119
威望
0
注册时间
2014-9-24
在线时间
630 小时
最后登录
2017-6-23
发表于 2016-11-24 11:42:00 | 显示全部楼层
简单粗暴,我喜欢,原教程那边我弄得shader在场景不显示,莫名其妙。。。

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1490/1500
排名
932
昨日变化

5

主题

192

帖子

1490

积分

Rank: 6Rank: 6Rank: 6

UID
14807
好友
2
蛮牛币
2303
威望
0
注册时间
2014-2-18
在线时间
415 小时
最后登录
2017-6-23
发表于 2016-12-6 14:50:01 | 显示全部楼层
很好很强大,支持一下~~~

回复 支持 反对

使用道具 举报

4四处流浪
406/500
排名
3611
昨日变化
29

0

主题

17

帖子

406

积分

Rank: 4

UID
155395
好友
1
蛮牛币
1071
威望
0
注册时间
2016-7-6
在线时间
102 小时
最后登录
2017-6-23
发表于 2016-12-14 17:35:27 | 显示全部楼层
原教程已搞定

回复

使用道具 举报

排名
16629
昨日变化
11

0

主题

33

帖子

75

积分

Rank: 2Rank: 2

UID
38790
好友
0
蛮牛币
28
威望
0
注册时间
2014-8-8
在线时间
22 小时
最后登录
2017-3-2
发表于 2016-12-22 11:21:18 | 显示全部楼层
好东西。学习了

回复

使用道具 举报

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

本版积分规则

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