- Home /
 
Why won't my multiply shader work with a texture set to Point (no filter)?
Hey folks!
So, I'm working on my first shader - shader newbie here - which takes a greyscale section of a texture (UV) and multiplies it by a block of colour on the same texture (UV2). This works great, but I'm also hoping to get a retro-ish pixel-art effect with the texture - so I set the texture filter to 'point' (or 'no filter')...
Immediately the colour tinting stops working - the texture is sharp and pixelated, but it's no-longer tinted by the color block.
Can anybody tell me how to get my tinting shader to work with a texture set to point ('no filter')?
Shader code follows...
 Shader "OldSchool/TranspSkinTone"
 {
     Properties
     {
         _MainTex ("Texture", 2D) = "white" {}
     }
     SubShader
     {
         Tags { "Queue"="Transparent" "RenderType"="Transparent" }
         LOD 100
 
         Pass
         {
             CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             // make fog work
             #pragma multi_compile_fog
             
             #include "UnityCG.cginc"
 
             struct appdata
             {
                 float4 vertex : POSITION;
                 float2 uv : TEXCOORD0;
                 float2 uv2Tone : TEXCOORD1;
             };
 
             struct v2f
             {
                 float2 uv : TEXCOORD0;
                 float2 uv2 : TEXCOORD1;
                 UNITY_FOG_COORDS(1)
                 float4 vertex : SV_POSITION;
             };
 
             sampler2D _MainTex;
             float4 _MainTex_ST;
             
             v2f vert (appdata v)
             {
                 v2f o;
                 o.vertex = UnityObjectToClipPos(v.vertex);
                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                 UNITY_TRANSFER_FOG(o,o.vertex);
                 return o;
             }
             
             fixed4 frag (v2f i) : SV_Target
             {
                 // sample the texture
                 fixed4 col = tex2D(_MainTex, i.uv);
                 fixed4 colTone = tex2D(_MainTex, i.uv2);
                 col *= colTone;
                 clip(col.a - 1);
                 
                 // apply fog
                 UNITY_APPLY_FOG(i.fogCoord, col);
                 return col;
             }
             ENDCG
         }
     }
 }
 
               Thanks in advance,
--Rev
Answer by Reverend-Speed · Sep 14, 2017 at 10:23 AM
Hey, I was given a solution by Skilfuldriver on the Unity Forums... I failed to initialise my second UV set in the Vertex program, so the fragment program was doing nothing with the second set.
As it turns out, filtering wasn't the problem - which suggests that the tinting effect I was getting with my earlier code was... an error? Nonetheless, tinting works with a point texture using the following shader code:
 Shader "OldSchool/TranspSkinTone"
 {
     Properties
     {
         _MainTex ("Texture", 2D) = "white" {}
     }
     SubShader
     {
         Tags { "Queue"="Transparent" "RenderType"="Transparent" }
         LOD 100
 
         Pass
         {
             CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             // make fog work
             #pragma multi_compile_fog
             
             #include "UnityCG.cginc"
 
             struct appdata
             {
                 float4 vertex : POSITION;
                 float2 uv : TEXCOORD0;
                 float2 uv2Tone : TEXCOORD1;
             };
 
             struct v2f
             {
                 float2 uv : TEXCOORD0;
                 float2 uv2 : TEXCOORD1;
                 UNITY_FOG_COORDS(2)
                 float4 vertex : SV_POSITION;
             };
 
             sampler2D _MainTex;
             float4 _MainTex_ST;
             
             v2f vert (appdata v)
             {
                 v2f o;
                 o.vertex = UnityObjectToClipPos(v.vertex);
                 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                 o.uv2 = TRANSFORM_TEX(v.uv2Tone, _MainTex);
                 UNITY_TRANSFER_FOG(o,o.vertex);
                 return o;
             }
             
             fixed4 frag (v2f i) : SV_Target
             {
                 // sample the texture
                 fixed4 col = tex2D(_MainTex, i.uv);
                 fixed4 colTone = tex2D(_MainTex, i.uv2);
                 col *= colTone;
                 clip(col.a - 1);
                 
                 // apply fog
                 UNITY_APPLY_FOG(i.fogCoord, col);
                 return col;
             }
             ENDCG
         }
     }
 }
 
               All the best,
--Rev
Your answer