|
My shader setup was pretty simple, here's a snippet of the important parts:
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _Color;
v2f vert ( appdata_base v )
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
// Texture offset - BAD
o.uv = v.texcoord;
return o;
}
half4 frag (v2f i) : COLOR
{
return tex2D(_MainTex, i.uv) * _Color;
}
I bolded the problematic part, which is the Texture UV handling in the 'vert' program. Simply grabbing the v.texcoord will work when there is not tiling or offsets in the texture, but breaks once those elements are introduced
After snooping around, I found the solution is to use the TRANSFORM_TEX macro in the UnityCG.cginc to make sure the texture's offset and tiling are properly applied. A small caveat to this is you must, "declare float4 properties for each texture before the vertex program, with _ST appended" (Quoted from Unity3d shader docs).
Here's a snippet of my shader with the new changes:
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _Color;
uniform float4 _MainTex_ST; // Needed for TRANSFORM_TEX(v.texcoord, _MainTex)
v2f vert ( appdata_base v )
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
// Texture offset - GOOD
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR
{
return tex2D(_MainTex, i.uv) * _Color;
}
With this happy little change, our shader now properly handles the tiling and offsets of the texture.
For those curious, I gleaned this information from the Unity3D Vertex and Fragment Programs and the ancient Unity 2.x Shader Conversion Guide. The info pulled from the Shader conversion guide regards the _MainTex_ST property needed for TRANSFORM_TEX to work.
UPDATE - Dec 1, 2013 - The Unity 2.x Shader Conversion Guide seems to have disappeared from the internet. This information is all still relevant for Unity 4.x release versions