代码之家  ›  专栏  ›  技术社区  ›  FutureCake

Unity自定义明暗器第二遍未执行

  •  1
  • FutureCake  · 技术社区  · 7 年前

    我有一个明暗器,应该做两个过程,将渲染后一个前面一次。请参见下面的明暗器代码:

    Shader "Custom/Geometry/Wireframe"
    {
        Properties
        {
            _MainTex ("Texture", 2D) = "white" {}
            [PowerSlider(3.0)]
            _WireframeVal ("Wireframe width", Range(0., 0.34)) = 0.05
            _FrontColor ("Front color", color) = (1., 1., 1., 1.)
            _BackColor ("Back color", color) = (1., 1., 1., 1.)
        }
        SubShader
        {
            Tags { "RenderType"="Opaque" }
    
            Pass
            {
                Cull Back
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma geometry geom
                #include "UnityCG.cginc"
    
                struct v2g {
                    float4 pos : SV_POSITION;
                };
    
                struct g2f {
                    float4 pos : SV_POSITION;
                    float3 bary : TEXCOORD0;
                };
    
                v2g vert(appdata_base v) {
                    v2g o;
                    o.pos = UnityObjectToClipPos(v.vertex);
                    return o;
                }
    
                [maxvertexcount(3)]
                void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream) {
                    g2f o;
                    o.pos = IN[0].pos;
                    o.bary = float3(1., 0., 0.);
                    triStream.Append(o);
                    o.pos = IN[1].pos;
                    o.bary = float3(0., 0., 1.);
                    triStream.Append(o);
                    o.pos = IN[2].pos;
                    o.bary = float3(0., 1., 0.);
                    triStream.Append(o);
                }
    
                float _WireframeVal;
                fixed4 _FrontColor;
    
                fixed4 frag(g2f i) : SV_Target {
                if(!any(bool3(i.bary.x < _WireframeVal, i.bary.y < _WireframeVal, i.bary.z < _WireframeVal)))
                     discard;
    
                    return _FrontColor;
                }
    
                ENDCG
            }
    
            Pass
            {
                Cull Front
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #pragma geometry geom
                #include "UnityCG.cginc"
    
                struct v2g {
                    float4 pos : SV_POSITION;
                };
    
                struct g2f {
                    float4 pos : SV_POSITION;
                    float3 bary : TEXCOORD0;
                };
    
                v2g vert(appdata_base v) {
                    v2g o;
                    o.pos = UnityObjectToClipPos(v.vertex);
                    return o;
                }
    
                [maxvertexcount(3)]
                void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream) {
                    g2f o;
                    o.pos = IN[0].pos;
                    o.bary = float3(1., 0., 0.);
                    triStream.Append(o);
                    o.pos = IN[1].pos;
                    o.bary = float3(0., 0., 1.);
                    triStream.Append(o);
                    o.pos = IN[2].pos;
                    o.bary = float3(0., 1., 0.);
                    triStream.Append(o);
                }
    
                float _WireframeVal;
                fixed4 _BackColor;
    
                fixed4 frag(g2f i) : SV_Target {
                if(!any(bool3(i.bary.x < _WireframeVal, i.bary.y < _WireframeVal, i.bary.z < _WireframeVal)))
                     discard;
    
                    return _BackColor;
                }
    
                ENDCG
            }
        }
    }
    

    但我遇到的问题是,代码中的第二个传递永远不会执行。因为当我为后传递设置颜色时,该颜色在应用了明暗器(材质)的网格上永远不可见。

    另外,如果我交换传球,使后传球先于前传球,则会出现相反的问题。

    编辑
    请参见以下图片:应用了材质的网格的正面和使用材质的相同网格的背面的图片:
    前面:
    FRONT
    背部:
    BACK

    这是我第一次尝试制作这样一个材质球,所以所有的帮助都是非常重视的!

    1 回复  |  直到 7 年前
        1
  •  0
  •   Technivorous    7 年前

    enter image description here enter image description here 拆下这个支架

    Shader "Custom/Geometry/Wireframe"
    
    {<<<<<<<<<<<<
        Properties
        {
    

    这使它对我有用

    不幸的是,着色程序没有自动完成功能,因此很容易忽略这样的错误,但是您的代码在编辑器中给了我以下错误:

    Parse error: syntax error unexpected '{' 3 (第三行附加支架)

    shader is not supported on this gpu (由语法错误引起)

    拆下支架可以解决问题!

    Shader "Custom/NewSurfaceShader" 
    {
    
    
            Properties
            {
                _MainTex("Texture", 2D) = "white" {}
                [PowerSlider(3.0)]
                _WireframeVal("Wireframe width", Range(0., 0.34)) = 0.05
                _FrontColor("Front color", color) = (1., 1., 1., 1.)
                _BackColor("Back color", color) = (1., 1., 1., 1.)
            }
                SubShader
                {
                    Tags { "RenderType" = "Opaque" }
    
                    Pass
                    {
                        Cull Back
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma geometry geom
                        #include "UnityCG.cginc"
    
                        struct v2g {
                            float4 pos : SV_POSITION;
                        };
    
                        struct g2f {
                            float4 pos : SV_POSITION;
                            float3 bary : TEXCOORD0;
                        };
    
                        v2g vert(appdata_base v) {
                            v2g o;
                            o.pos = UnityObjectToClipPos(v.vertex);
                            return o;
                        }
    
                        [maxvertexcount(3)]
                        void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream) {
                            g2f o;
                            o.pos = IN[0].pos;
                            o.bary = float3(1., 0., 0.);
                            triStream.Append(o);
                            o.pos = IN[1].pos;
                            o.bary = float3(0., 0., 1.);
                            triStream.Append(o);
                            o.pos = IN[2].pos;
                            o.bary = float3(0., 1., 0.);
                            triStream.Append(o);
                        }
    
                        float _WireframeVal;
                        fixed4 _FrontColor;
    
                        fixed4 frag(g2f i) : SV_Target {
                        if (!any(bool3(i.bary.x < _WireframeVal, i.bary.y < _WireframeVal, i.bary.z < _WireframeVal)))
                             discard;
    
                            return _FrontColor;
                        }
    
                        ENDCG
                    }
    
                    Pass
                    {
                        Cull Front
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #pragma geometry geom
                        #include "UnityCG.cginc"
    
                        struct v2g {
                            float4 pos : SV_POSITION;
                        };
    
                        struct g2f {
                            float4 pos : SV_POSITION;
                            float3 bary : TEXCOORD0;
                        };
    
                        v2g vert(appdata_base v) {
                            v2g o;
                            o.pos = UnityObjectToClipPos(v.vertex);
                            return o;
                        }
    
                        [maxvertexcount(3)]
                        void geom(triangle v2g IN[3], inout TriangleStream<g2f> triStream) {
                            g2f o;
                            o.pos = IN[0].pos;
                            o.bary = float3(1., 0., 0.);
                            triStream.Append(o);
                            o.pos = IN[1].pos;
                            o.bary = float3(0., 0., 1.);
                            triStream.Append(o);
                            o.pos = IN[2].pos;
                            o.bary = float3(0., 1., 0.);
                            triStream.Append(o);
                        }
    
                        float _WireframeVal;
                        fixed4 _BackColor;
    
                        fixed4 frag(g2f i) : SV_Target {
                        if (!any(bool3(i.bary.x < _WireframeVal, i.bary.y < _WireframeVal, i.bary.z < _WireframeVal)))
                             discard;
    
                            return _BackColor;
                        }
    
                        ENDCG
                    }
                }
        }
    
    推荐文章