UNITY,SHADER战争着色器雾导致团结崩溃

时间:2018-05-14 13:34:29

标签: c# unity3d shader

昨天我为我的RTS游戏实施了战争迷雾。昨晚睡觉之前一切正常,我逐个检查,并经过大量测试,以确保它正常工作,一切都很好。

但是今天,当我尝试运行游戏时,它会加载主菜单,但是当它尝试加载第一级时,统一崩溃并且没有给我一个理由。

我尝试浏览代码和游戏对象,直到我发现如果我删除附加到我用来在地图上创建雾的地形的自定义着色器,它将停止崩溃统一并继续运行游戏,但是我重新连接它随着战争的迷雾再次运转它再次运行良好,但是当我关闭统一并再次打开它时,崩溃加载第一级时也出现了同样的问题。

我不确定它是否是着色器或导致问题的代码。 我对着色器几乎没有经验,但是如果有人可以查看它的代码并告诉我,如果有任何问题,我会非常感激。

    Shader "Fog Of War/Terrain" {
    Properties {
        _FOWTex ("Detail", 2D) = "gray" {}

        // Splat Map Control Texture
        [HideInInspector] _Control ("Control (RGBA)", 2D) = "red" {}
        [HideInInspector] _Splat3 ("Layer 3 (A)", 2D) = "white" {}
        [HideInInspector] _Splat2 ("Layer 2 (B)", 2D) = "white" {}
        [HideInInspector] _Splat1 ("Layer 1 (G)", 2D) = "white" {}
        [HideInInspector] _Splat0 ("Layer 0 (R)", 2D) = "white" {}

        // used in fallback on old cards & base map
        // [HideInInspector] _MainTex ("BaseMap (RGB)", 2D) = "white" {}
        // [HideInInspector] _Color ("Main Color", Color) = (1,1,1,1)
    }
    SubShader {
        Tags { "RenderType"="Opaque" 
                "SplatCount" = "4"
            }
        CGPROGRAM
        #pragma surface surf Lambert nolightmap

        struct Input {
            float2 uv_FOWTex;
            float2 uv_Control : TEXCOORD0;
            float2 uv_Splat0 : TEXCOORD1;
            float2 uv_Splat1 : TEXCOORD2;
            float2 uv_Splat2 : TEXCOORD3;
            float2 uv_Splat3 : TEXCOORD4;
        };

        sampler2D _Control, _FOWTex;
        sampler2D _Splat0,_Splat1,_Splat2,_Splat3;

        void surf (Input IN, inout SurfaceOutput o) {
            fixed4 splat_control = tex2D (_Control, IN.uv_Control);
            fixed3 col;
            col  = splat_control.r * tex2D (_Splat0, IN.uv_Splat0).rgb;
            col += splat_control.g * tex2D (_Splat1, IN.uv_Splat1).rgb;
            col += splat_control.b * tex2D (_Splat2, IN.uv_Splat2).rgb;
            col += splat_control.a * tex2D (_Splat3, IN.uv_Splat3).rgb;
            o.Albedo = col;
            fixed3 c = tex2D (_FOWTex, IN.uv_FOWTex).aaa;
            c = 1-c;
            o.Albedo *= c;
        }
        ENDCG
    }
    FallBack off
}

1 个答案:

答案 0 :(得分:0)

着色器不太可能导致应用程序崩溃。如果着色器出现问题,Unity将无法编译着色器,并且使用它的任何内容都将呈现为鲜艳的粉红色。

我没有在着色器中看到任何可怕的错误,不过这一行:

float2 uv_FOWTex;
在你的输入结构中我认为可能没必要。

要调试它,你可以将你的Fog of War着色器删除为尽可能基本和简单。然后看看它是否一直崩溃。它没有,然后逐渐添加到着色器的片断,直到它。

但是,当遇到崩溃时,通常会因为调用非托管代码而做坏事。