I am using the next script for a painting asset found on this website.

As you render the faces of your mesh in the uv space of the mesh, you are reconstruction the islands one triangle at the time. On the edges of the island, it can be that due to underestimation the rasterizer doesn’t consider a pixel which is actually in the island. For these pixels, no pixel shader will be executed and you will be left over with a crease. (text and image taken form the website)

enter image description here

The basic idea is that every frame, after the paint texture has been updated, I run a shader over the entire texture, and using a filter and a pre baked mask of the uv islands, extend the islands outwards.

The problem is that it does not work on iPhone. There is no error, no weird coloring, it is like that script does not get applied. I am not sure where the problem is coming from..maybe the for loops or the command buffers used in c#.

Shader "Unlit/FixIlsandEdges"
        // =====================================================================================================================
        // TAGS AND SETUP ------------------------------------------
        Tags { "RenderType"="Opaque" }
        LOD 100
        // =====================================================================================================================
        // DEFINE AND INCLUDE ----------------------------------
            #pragma  vertex   vert
            #pragma  fragment frag
            #include "UnityCG.cginc"
            // =====================================================================================================================
            // DECLERANTIONS ----------------------------------
            struct appdata
                float4 vertex : POSITION;
                float2 uv      : TEXCOORD0;
            struct v2f
                float2 uv      : TEXCOORD0;
                float4 vertex : SV_POSITION;
                    sampler2D    _MainTex;
            uniform    float4        _MainTex_TexelSize;
                    sampler2D   _IlsandMap;
            // =====================================================================================================================
            // VERTEX FRAGMENT ----------------------------------
            v2f vert (appdata v)
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv     = v.uv;
                return o;
            fixed4 frag (v2f i) : SV_Target
            fixed4 col = tex2D(_MainTex, i.uv);
            float map  = tex2D(_IlsandMap,i.uv);
            float3 average = col;
            if (map.x < 0.2) {                                    // only take an average if it is not in a uv ilsand
                int n = 0;
                average = float3(0., 0., 0.);
                for (float x = -1.5; x <= 1.5; x++) {
                    for (float y = -1.5; y <= 1.5; y++) {
                        float3 c =  tex2D(_MainTex, i.uv + _MainTex_TexelSize.xy*float2(x, y));
                        float  m =  tex2D(_IlsandMap, i.uv + _MainTex_TexelSize.xy*float2(x, y));
                               n += step(0.1, m);
                         average += c * step(0.1, m);
                average /= n;
            col.xyz = average;
                return col;

I've read somewhere that using tex2D in for loops is a big no no, so I changed that to a tex2Dlod but the same thing happens.

You can check out the Git project here

I am completely lost on this one and google isn't very helpful. Thank you for any comments.

  • \$\begingroup\$ Did you try taking out the for loop to test whether that is a problem? \$\endgroup\$ – DMGregory Mar 14 '20 at 14:25
  • \$\begingroup\$ The same thing happens even without for loops. \$\endgroup\$ – Alien Boy Games Mar 14 '20 at 18:28

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.