Question

I'm writing Cg shaders using Unity3D.

I'm trying to use fmod function to repeat a texture along an axis (basically the same effect I can achieve by setting the texture scale in Material with TextureWrapMode.Repeat ).

This is the fragment shader code that can reproduce the error:

half4 frag (v2f i) : COLOR
{

  float u_sample_coord = fmod(i.uv.x ,period) /period;
  half4 col =tex2D(myTexture,float2(u_sample_coord, i.uv.y));  
  return col;
}

Basically it seems to work but it produces some sort of aliasing (a strip pattern) in correspondance with 0's of fmod function. Here's some screenshot:

enter image description here

The image above shows how texture repeats correctly. Here's a zoom on the strip aliasing pattern emerged:

enter image description here

I tried to debug it but I can't figure out what's going on exactly. Anyone could tell me what's the problem and eventually how to solve it?


EDIT: I found out that disabling mipmap generation solve this problem. Btw I'd like to use mipmap to avoid minification aliasing problem while the distance increase. Anyone has any idea?

Was it helpful?

Solution

You'll need to explicitly set the u and v derivatives in the tex2D() function. But: why are you using fmod? If the sampler's repeat mode is set to wrap, then you can let the UV coordinates roam far beyond the 0-1 range. It will wrap by itself.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top