[Unity教程] 3D打印机shader特效简单实现
本帖最后由 naixiaoxian 于 2016-11-22 14:14 编辑

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


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

[mw_shl_code=csharp,true]#pragma surface surf Unlit fullforwardshadows
inline half4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten)
{
        return _ConstructColor;
}[/mw_shl_code]


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

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


然后看上去cube里面是黑色的话其实由两部分原因,

首先是加了CULL off ,cull off 意思是双面渲染,如果不加就会这样

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



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

效果类似这样子


     [mw_shl_code=csharp,true]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"
} [/mw_shl_code]

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

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








好文章!顶!
  • 板凳 Gray497
  • 2016-11-22 15:30:14
66666666666666666666
inline void LightingCustom_GI(SurfaceOutputStandard s, UnityGIInput data,inout UnityGI gi)


UnityGI只有Unity5,0以上才支持,所以这个shader只能在Unity5.+才可以使用
而且你把光照功能都关掉了,再去使用GI处理实时光照也没什么用了,所以你的模型看起来跟没没有光照效果了
很好很强大,支持一下~~~
引用: Winder灬晓东 发表于 2016-11-23 08:42
inline void LightingCustom_GI(SurfaceOutputStandard s, UnityGIInput data,inout UnityGI gi)

这个我知道。我在4.0上面写过。只是按照教程写的时候不知道是dot还是哪里出了问题不能实现光照的时候中间的截面被填满的效果。论坛里面还有个哥们写的4.7的版本的确实是可以。但是我按照教程就是走不出来也不知道是什么地方出了问题。把他那个扒下来好好研究研究- -
引用: Winder灬晓东 发表于 2016-11-23 08:56
而且你把光照功能都关掉了,再去使用GI处理实时光照也没什么用了,所以你的模型看起来跟没没有光照效果了{: ...

所以如果要用GI的话应该把光照然后lighting里面的bake都打开对么?
引用: Winder灬晓东 发表于 2016-11-23 08:56
而且你把光照功能都关掉了,再去使用GI处理实时光照也没什么用了,所以你的模型看起来跟没没有光照效果了{: ...

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


[mw_shl_code=csharp,true]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"
}
[/mw_shl_code]
引用: naixiaoxian 发表于 2016-11-23 09:21
这个我知道。我在4.0上面写过。只是按照教程写的时候不知道是dot还是哪里出了问题不能实现光照的时候中间 ...

你说的那哥们就是我。。。。我换了马甲了 哈哈
好棒啊 可以拿币
  • 12# llupll
  • 2016-11-24 11:42:00
简单粗暴,我喜欢,原教程那边我弄得shader在场景不显示,莫名其妙。。。
  • 13# cigame
  • 2016-12-6 14:50:01
很好很强大,支持一下~~~
原教程已搞定
好东西。学习了
12下一页