从 Unity 4.x 升级后 Unity 5 自定义着色器损坏
Unity 5 custom shader broken after upgrade from Unity 4.x
我在 iOS 上调试 Unity 应用时遇到了一些问题。有一个在屏幕上画线的功能,它使用了自定义着色器。我得到的错误是:
NullReferenceException
at UnityEngine.Material..ctor (UnityEngine.Shader shader) [0x00000] in <filename unknown>:0
at Drawable.InitColor (Color lineColour) [0x00039] in /Users/.../Drawable.cs:269
Drawable.cs 中的第 269 行是:
mLineRenderer.material = new Material(Shader.Find("Custom/LineRender"));
shader代码如下:
Shader "Custom/LineRender"
{
Properties {
_Color ("Color", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader {
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Off
LOD 200
Pass{
CGPROGRAM
#pragma surface surf Lambert
fixed4 _Color;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _Color.rgb;
o.Emission = _Color.rgb; // * _Color.a;
o.Alpha = _Color.a;
}
ENDCG
}
}
}
我不太了解着色器,所以我不确定这里发生了什么。但它在 Unity 4.6 中有效,现在在 Unity 5 中无效。任何人都可以看到任何明显的破坏它的东西吗?
错误向我表明 Shader.Find("Custom/LineRender")
无法 return 一个有效的着色器。
为确保您的着色器可供您从代码加载,您可以将其添加到 "Always included shaders"。您可以在 Unity 菜单的 Edit > Project Settings > Graphics
中找到它们。
至于原因,只能猜测,但我偶尔会发生以下情况:您的代码可能 "magically" 在过去工作过,例如,您的一个预制件可能已经使用着色器。它可能已分配给资源中的 material 等。某些东西将其拉入您的项目,从而使您可以从代码中加载它。当情况不再如此时,您的代码也会失败。
我在 iOS 上调试 Unity 应用时遇到了一些问题。有一个在屏幕上画线的功能,它使用了自定义着色器。我得到的错误是:
NullReferenceException
at UnityEngine.Material..ctor (UnityEngine.Shader shader) [0x00000] in <filename unknown>:0
at Drawable.InitColor (Color lineColour) [0x00039] in /Users/.../Drawable.cs:269
Drawable.cs 中的第 269 行是:
mLineRenderer.material = new Material(Shader.Find("Custom/LineRender"));
shader代码如下:
Shader "Custom/LineRender"
{
Properties {
_Color ("Color", Color) = (1.0, 1.0, 1.0, 1.0)
}
SubShader {
Tags { "RenderType" = "Transparent" "Queue" = "Transparent" }
Blend SrcAlpha OneMinusSrcAlpha
Cull Off
LOD 200
Pass{
CGPROGRAM
#pragma surface surf Lambert
fixed4 _Color;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _Color.rgb;
o.Emission = _Color.rgb; // * _Color.a;
o.Alpha = _Color.a;
}
ENDCG
}
}
}
我不太了解着色器,所以我不确定这里发生了什么。但它在 Unity 4.6 中有效,现在在 Unity 5 中无效。任何人都可以看到任何明显的破坏它的东西吗?
错误向我表明 Shader.Find("Custom/LineRender")
无法 return 一个有效的着色器。
为确保您的着色器可供您从代码加载,您可以将其添加到 "Always included shaders"。您可以在 Unity 菜单的 Edit > Project Settings > Graphics
中找到它们。
至于原因,只能猜测,但我偶尔会发生以下情况:您的代码可能 "magically" 在过去工作过,例如,您的一个预制件可能已经使用着色器。它可能已分配给资源中的 material 等。某些东西将其拉入您的项目,从而使您可以从代码中加载它。当情况不再如此时,您的代码也会失败。