- Home /
Shader not working, gameobject pink on Android. Fine on Editor
Been at it the whole day and I still can't figure it out why it doesn't work on android but it's working in the editor. I've included the shader in ProjectSettings->Graphics
This is the error I'm getting: "Shader error in 'Sprites/Outline': '[' : syntax error syntax error at line 96 (on gles)".
Line 96 has this [unroll(16)] ->Max outline size is 16px
Here's my shader:
[CODE]
Shader "Sprites/Outline"
{
Properties
{
[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}
_Color("Tint", Color) = (1,1,1,1)
[MaterialToggle] PixelSnap("Pixel snap", Float) = 0
// Add values to determine if outlining is enabled and outline color.
[PerRendererData] _Outline("Outline", Float) = 0
[PerRendererData] _OutlineColor("Outline Color", Color) = (1,1,1,1)
[PerRendererData] _OutlineSize("Outline Size", int) = 1
}
SubShader
{
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
"PreviewType" = "Plane"
"CanUseSpriteAtlas" = "True"
}
Cull Off
Lighting Off
ZWrite Off
Blend One OneMinusSrcAlpha
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile _ PIXELSNAP_ON
#pragma shader_feature ETC1_EXTERNAL_ALPHA
#include "UnityCG.cginc"
struct appdata_t
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
fixed4 _Color;
float _Outline;
fixed4 _OutlineColor;
int _OutlineSize;
v2f vert(appdata_t IN)
{
v2f OUT;
OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.color = IN.color * _Color;
#ifdef PIXELSNAP_ON
OUT.vertex = UnityPixelSnap(OUT.vertex);
#endif
return OUT;
}
sampler2D _MainTex;
sampler2D _AlphaTex;
float4 _MainTex_TexelSize;
fixed4 SampleSpriteTexture(float2 uv)
{
fixed4 color = tex2D(_MainTex, uv);
#if ETC1_EXTERNAL_ALPHA
// get the color from an external texture (usecase: Alpha support for ETC1 on android)
color.a = tex2D(_AlphaTex, uv).r;
#endif //ETC1_EXTERNAL_ALPHA
return color;
}
fixed4 frag(v2f IN) : SV_Target
{
fixed4 c = SampleSpriteTexture(IN.texcoord) * IN.color;
// If outline is enabled and there is a pixel, try to draw an outline.
if (_Outline > 0 && c.a != 0) {
float totalAlpha = 1.0;
[unroll(16)] <-- Error here...
for (int i = 1; i < _OutlineSize + 1; i++) {
fixed4 pixelUp = tex2D(_MainTex, IN.texcoord + fixed2(0, i * _MainTex_TexelSize.y));
fixed4 pixelDown = tex2D(_MainTex, IN.texcoord - fixed2(0,i * _MainTex_TexelSize.y));
fixed4 pixelRight = tex2D(_MainTex, IN.texcoord + fixed2(i * _MainTex_TexelSize.x, 0));
fixed4 pixelLeft = tex2D(_MainTex, IN.texcoord - fixed2(i * _MainTex_TexelSize.x, 0));
totalAlpha = totalAlpha * pixelUp.a * pixelDown.a * pixelRight.a * pixelLeft.a;
}
if (totalAlpha == 0) {
c.rgba = fixed4(1, 1, 1, 1) * _OutlineColor;
}
}
c.rgb *= c.a;
return c;
}
ENDCG
}
}
}
Can someone please take a look at this and help me figure it out what's wrong? Thanks.
Have you tried removing that directive and letting the compiler decide to unroll the loop automatically? Have you tried setting a smaller _OutlineSize ?
Hi, If II remove it, I get the following error and it stops working in the editor:
"unable to unroll loop, loop does not appear to ter$$anonymous$$ate in a timely manner (1024 iterations) Compiling Fragment program Platform defines: UNITY_ENABLE_REFLECTION_BUFFERS UNITY_PBS_USE_BRDF1 UNITY_SPECCUBE_BOX_PROJECTION UNITY_SPECCUBE_BLENDING"
Right now I'm using 8 for _OutlineSize
That's 32 texture lookups for every pixel rendered by the fragment shader....! What if you use, say 2, for outline size?
Still getting an error:
"unable to unroll loop, loop does not appear to ter$$anonymous$$ate in a timely manner (1024 iterations) Compiling Vertex program Platform defines: UNITY_NO_DXT5nm UNITY_NO_RGB$$anonymous$$ UNITY_NO_SCREENSPACE_SHADOWS UNITY_NO_LINEAR_COLORSPACE UNITY_ENABLE_REFLECTION_BUFFERS UNITY_FRA$$anonymous$$EBUFFER_FETCH_AVAILABLE UNITY_PBS_USE_BRDF2 SHADER_API_$$anonymous$$OBILE UNITY_HARDWARE_TIER2"
Also forgot to add this warning:
"gradient instruction used in a loop with varying iteration, forcing loop to unroll Compiling Vertex program Platform defines: UNITY_NO_DXT5nm UNITY_NO_RGB$$anonymous$$ UNITY_NO_SCREENSPACE_SHADOWS UNITY_NO_LINEAR_COLORSPACE UNITY_ENABLE_REFLECTION_BUFFERS UNITY_FRA$$anonymous$$EBUFFER_FETCH_AVAILABLE UNITY_PBS_USE_BRDF2 SHADER_API_$$anonymous$$OBILE UNITY_HARDWARE_TIER2"
Answer by code-and-design-inc · Feb 23, 2018 at 02:19 AM
You should try it.
add code
pragma target 4.0
Your answer
Follow this Question
Related Questions
Shader From Assetbundle Compiled On PC with Target of Android Platform Turn Pink 0 Answers
Pink custom shader on Android build 0 Answers
Unity Terrain texture issue on android device 1 Answer
Shader not working correctly on android 1 Answer
This shader (or Image Effect) is not working on Android 0 Answers