I’m trying to achieve a dynamic white shoreline/foam/splashing effect around objects in water, similar to the white foam seen in Monument Valley (relevant footage at 0:14).
I successfully got the look I was going for with Texture2D.SetPixels(), but, not surprisingly, I’m getting terrible frame rates by calling Texture2D.SetPixels() every frame.
My question is how can I achieve a similar effect without taking such a big performance hit?

(animated GIF: Imgur: The magic of the Internet)
My water is a simple plane object (GameObject > 3D Object > Plane) with a flat blue texture on it. I’m modifying its vertices on the y-axis every frame to create a wave effect, and I have a simple cube (which can move around) standing in the water.
The white foam around the cube is a simple particle system (custom written) that’s updated every frame in Update() and drawn directly onto the blue Texture2D of the plane with Texture2D.SetPixels() and sent to the GPU with Texture2D.Apply(). This creates the exactly the visual look I’m going for, but the performance is atrocious.
Help me, O’ Graphics Gods of Unity. Does anyone have any alternative ideas on how I could get a similar effect but maintain good performance? Obviously a normal Unity particle system would provide great performance, but Unity’s particle systems can’t “adhere” to the surface of a mesh (and they don’t have the correct perspective, nor do they wobble with the waves as seen in the image above). I’ve seen mention of “dynamic decals” and shaders and RenderTextures and shadow projectors for doing this type of thing, but those solutions are typically only mentioned as a single sentence solution without details or examples, so I’m having trouble searching around to find out how to use them to achieve this effect.
I have a little bit of experience with shaders, but I’m not sure how I can leverage them to get this effect. I understand that why what I’m doing is so expensive is because I’m sending a full texture (512x512 RGB, about 786KB in memory?) to the GPU every frame. Is there some better way to draw dynamic particles directly on the GPU? All I can think is that, since I have a very flat/simple look, I really only need a single bit per pixel (512x512=262144 bits=32KB) to tell the GPU whether the pixel should be the default blue or white. But I wouldn’t even know how to get started writing a pixel shader that could take in an array of bits and create the effect I’m going for. (And maybe that’s still too much data to send to the GPU every frame, anyway.)
Is using a shader even on the right track? Should I instead be looking into decals/RenderTextures/projectors? If so, how would I use them to create this effect?