Domanda

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?

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top