【问题标题】:UNITY, SHADER Fog of War shader causing unity crashUNITY,SHADER 战争迷雾着色器导致统一崩溃
【发布时间】:2018-10-24 04:39:51
【问题描述】:

昨天我为我的 RTS 游戏实施了战争迷雾。昨晚睡觉前一切正常,我逐场检查并进行了大量测试以确保一切正常。

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

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

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

    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
}

【问题讨论】:

  • 如果它导致 unity 崩溃,那么您最好在他们的问题跟踪器站点创建票证并将您的崩溃日志也提供给他们。

标签: c# unity3d shader


【解决方案1】:

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

我没有在着色器中看到任何严重错误,但是这一行:

float2 uv_FOWTex;

在您的输入结构中,我认为可能没有必要。

要调试它,您可以将战争迷雾着色器剥离到尽可能基本和简单的程度。然后看看是不是一直闪退。它没有,然后逐渐添加着色器的片段,直到它出现。

但是,当涉及到崩溃时,通常是因为您对非托管代码的调用做了坏事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    相关资源
    最近更新 更多