Changing sin frequency smoothly in shader

In my vertex shader I am using a sin function to offset vertices. But as I change the frequency of my sin function I notice some "flickering" or "jumps". I guess that this comes from the fact that the phase is not synchronised any more.

float s = sin(frequency * _Time);


Is there a way to avoid those flickering effect while changing the frequency ?

You could go the calculus way and have an explicit rate of change that is outside your shader

float frequency = getFrequency();
sineTime += frequency * deltaTime;


(sineTime could be a float that is scoped right outside of your render loop, so that it retains its value)

And if you pass sineTime into your shader you can just do

float s = sin(sineTime);

• I already thought about that solution but I wanted to do stick everything inside the shader. I'll keep this as a backup solution, I guess :) – MaT Feb 15 '18 at 17:30
• @MaT: If you want everything inside the shader, then presumably the frequency is also computed within the shader as some function float frequency = f(_Time). Then you should do some calculus by hand to figure out $g(t) = \int_0^t f(\tau)\,\mathrm d\tau$ and implement that in the shader as well. Then you can do float s = sin(g(_Time)). – user106 Feb 16 '18 at 3:15