Hi guys, I have made 2 different blur shaders for my project. They work in the editor, but are not visible when I try to run the project on iOS. And when I switch to Android, I get a black rectangle instead of the first shader. Does anyone know how to remedy the situation? I can't actually upgrade to Unity 5 with this project as too many things get broken. So for now I'm running Unity 4.6.3f1. I tried to select Automatic & Metal in iOS graphic settings with no positive effect. Selecting OpenGL ES 3.0 produces black screen on iPhone - iOS 8.3, xCode 6.3. GaussianBlur shader (works on RenderTexture as it purpose is to blur everything behind it) Code (CSharp): Shader "Custom/BlurGauss" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {} _blurSizeXY("BlurSizeXY", Range(0,10)) = 0 } SubShader { // Draw ourselves after all opaque geometry Tags { "Queue" = "Transparent" } // Grab the screen behind the object into _GrabTexture GrabPass { } // Render the object with the texture generated above Pass { CGPROGRAM #pragma target 3.0 #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _GrabTexture : register(s0); float _blurSizeXY; struct data { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 position : POSITION; float4 screenPos : TEXCOORD0; }; v2f vert(data i){ v2f o; o.position = mul(UNITY_MATRIX_MVP, i.vertex); o.screenPos = o.position; return o; } half4 frag( v2f i ) : COLOR { float2 screenPos = i.screenPos.xy / i.screenPos.w; float depth= _blurSizeXY*0.0005; screenPos.x = (screenPos.x + 1) * 0.5; screenPos.y = (screenPos.y + 1) * 0.5; //was 1- half4 sum = half4(0.0h,0.0h,0.0h,0.0h); sum += tex2D( _GrabTexture, float2(screenPos.x-5.0 * depth, screenPos.y+5.0 * depth)) * 0.025; sum += tex2D( _GrabTexture, float2(screenPos.x+5.0 * depth, screenPos.y-5.0 * depth)) * 0.025; sum += tex2D( _GrabTexture, float2(screenPos.x-4.0 * depth, screenPos.y+4.0 * depth)) * 0.05; sum += tex2D( _GrabTexture, float2(screenPos.x+4.0 * depth, screenPos.y-4.0 * depth)) * 0.05; sum += tex2D( _GrabTexture, float2(screenPos.x-3.0 * depth, screenPos.y+3.0 * depth)) * 0.09; sum += tex2D( _GrabTexture, float2(screenPos.x+3.0 * depth, screenPos.y-3.0 * depth)) * 0.09; sum += tex2D( _GrabTexture, float2(screenPos.x-2.0 * depth, screenPos.y+2.0 * depth)) * 0.12; sum += tex2D( _GrabTexture, float2(screenPos.x+2.0 * depth, screenPos.y-2.0 * depth)) * 0.12; sum += tex2D( _GrabTexture, float2(screenPos.x-1.0 * depth, screenPos.y+1.0 * depth)) * 0.15; sum += tex2D( _GrabTexture, float2(screenPos.x+1.0 * depth, screenPos.y-1.0 * depth)) * 0.15; sum += tex2D( _GrabTexture, screenPos-5.0 * depth) * 0.025; sum += tex2D( _GrabTexture, screenPos-4.0 * depth) * 0.05; sum += tex2D( _GrabTexture, screenPos-3.0 * depth) * 0.09; sum += tex2D( _GrabTexture, screenPos-2.0 * depth) * 0.12; sum += tex2D( _GrabTexture, screenPos-1.0 * depth) * 0.15; sum += tex2D( _GrabTexture, screenPos) * 0.16; sum += tex2D( _GrabTexture, screenPos+5.0 * depth) * 0.15; sum += tex2D( _GrabTexture, screenPos+4.0 * depth) * 0.12; sum += tex2D( _GrabTexture, screenPos+3.0 * depth) * 0.09; sum += tex2D( _GrabTexture, screenPos+2.0 * depth) * 0.05; sum += tex2D( _GrabTexture, screenPos+1.0 * depth) * 0.025; return sum/1.8; } ENDCG } } Fallback Off } Texture Directional Blur (works on a texture - supposed to blur a selected sprite vertically) Code (CSharp): Shader"Unlit/TransparentColoredBlurred" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {} _blurSizeXY("BlurSizeXY", Range(0,10)) = 0 } SubShader { LOD 100 Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } Cull Off Lighting Off ZWrite Off Fog { Mode Off } Offset -1, -1 Blend SrcAlpha OneMinusSrcAlpha Pass { CGPROGRAM #pragma vertex vertexProgram #pragma fragment fragmentProgram #pragma target 3.0 #include "UnityCG.cginc" float _blurSizeXY; struct appdata_t { float4 vertex : POSITION; float2 textureCoordinate : TEXCOORD0; fixed4 color : COLOR; }; struct vertexToFragment { float4 vertex : SV_POSITION; half2 textureCoordinate : TEXCOORD0; fixed4 color : COLOR; }; sampler2D _MainTex; float4 _MainTex_ST; float _Distance; vertexToFragment vertexProgram (appdata_t vertexData) { vertexToFragment output; output.vertex = mul(UNITY_MATRIX_MVP, vertexData.vertex); output.textureCoordinate = TRANSFORM_TEX(vertexData.textureCoordinate, _MainTex); output.color = vertexData.color; return output; } fixed4 fragmentProgram (vertexToFragment input) : COLOR { float distance = _blurSizeXY * 0.00032; float depth= _blurSizeXY*0.0009; fixed4 computedColor = tex2D(_MainTex, input.textureCoordinate) * 0.3; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y + distance * 2)) * 0.15; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y - distance * 2)) * 0.15; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y + distance * 1.5)) * 0.35; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y - distance * 1.5)) * 0.35; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y + 5.0 * depth)) * 0.025; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y - 5.0 * depth)) * 0.025; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y + 4.0 * depth)) * 0.05; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y - 4.0 * depth)) * 0.05; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y + 3.0 * depth)) * 0.09; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y - 3.0 * depth)) * 0.09; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y + 2.0 * depth)) * 0.12; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y - 2.0 * depth)) * 0.12; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y + 1.0 * depth)) * 0.15; computedColor += tex2D(_MainTex, half2(input.textureCoordinate.x, input.textureCoordinate.y - 1.0 * depth)) * 0.15; return computedColor*(0.50+(depth*10)); } ENDCG } } }
did u try target at OpenGL ES 2.0? #pragma target 2.0 player setting , graphics API also OpenGL ES 2.0
Yes indeed it helped! thanks! I had to modify the first one a bit since it exceeded 64 instructions. Is it possible to increase the instruction limit with a setting in the shader? Would it have serious performance impact?