PlotStyle like ocean waves?

You can get a little bit of sparkling by using a high Specularity coefficient, but the result tends to look more like shiny plastic than water.

(* not a real ocean wave spectrum *)
f[x_, y_] := x/(x^2 + y^2)^(3/2)

ocean = Module[{n = 256, x, spectrum, r},
   x = N@RotateRight[Range[-n, n - 2, 2], n/2];
   spectrum = Quiet@Outer[f, x, x];
   spectrum[[1, 1]] = 0.0;
   r = RandomReal[NormalDistribution[0, 1], {n, n}] + 
     I RandomReal[NormalDistribution[0, 1], {n, n}];
   Rescale[Re[Fourier[r spectrum]]]];

ListPlot3D[ocean, PlotRange -> {-1, 2}, 
 PlotStyle -> {RGBColor[0.8, 0.9, 1.], Specularity[White, 200]}, 
 Lighting -> {{"Directional", White, {0, 0, 10}}}, Mesh -> False]

enter image description here


Rotate it around and you'll see that M is "not there yet" as @J.M. notes. From just about any point of view, it cannot really model sunlight reflecting off the surface. (If M can, then I can't get it to.)

SeedRandom[0];
waves = With[{n = 20}, 
   MapThread[
     Sin[#1^4 First@RotationMatrix[#2] . {x, y} + #3]/(1 + #1^(8)) &,
     {RandomReal[{0.2, 2.4}, n], RandomReal[{0.3, 1.2}, n], 
      RandomReal[2 Pi, n]}] // Total
   ];
col = RGBColor[0.6, 0.9, 1.];
col2 = RGBColor[1., 1., 0.8];
Plot3D[waves, {x, 0, 18}, {y, 0, 18},
 PlotRange -> 8, PlotPoints -> 75,
 Mesh -> None,
 Filling -> Bottom, FillingStyle -> Opacity[0.2, col], 
 PlotStyle -> Directive[
   Specularity[col2, 100],
   Glow[Darker[col, 0.9]],
   Opacity[0.2],
   col],
 Lighting -> {
   {"Ambient", Darker[col, 0.35]},
   {"Directional", col2, {{15, 15, 15}, {0, 0, 0}}}},
 ViewPoint -> {-2.1473148110909985`, -1.9225307125696098`, 
   1.7728267713727204`}]

enter image description here

It does make me want to go to a nice, warm beach, though.


Update

One trick to get sparkle on a translucent plot is to set the opacity to 1 and then interpolate between the two images as a function of brightness. One can only do this on Image once the lighting and view point are set, so the image cannot be rotated. (Got to work on the waves, some sort of combination of waves and @Simon's texture.)

SeedRandom[0];
waves = With[{n = 8, k = 2}, 
   MapThread[
      Sin[#1^4 First@RotationMatrix[#2] . {x, (2 y + Sin[#1^2 y/(1 + #1)])/3} + #3]/(1 + (#1 - 1/8)^(7)) &,
      {RandomReal[{0.7, 1.}, k]~Join~RandomReal[{1.5, 3.0}, n - 2 k], 
       RandomReal[{0.8, 1.2}, k]~Join~RandomReal[{1., 1.6}, n - 2 k], 
       RandomReal[2 Pi, n - k]}
    ]~Join~
     MapThread[
      Sin[#1^4 First@RotationMatrix[#2] . {x, (2 y + Sin[#1 y/(1 + #1)])/3} + #3]/(5/2 + (#1)^( 4)) &,
      {RandomReal[{1., 1.2}, k], RandomReal[{2.2, 2.6}, k], RandomReal[2 Pi, k]}] // Total];
col = RGBColor[0.6, 0.9, 1.];
col2 = RGBColor[1., 1., 0.8];
plot1 = Plot3D[waves, {x, 0, 18}, {y, 0, 18}, PlotRange -> 5, 
   PlotPoints -> 75, Mesh -> None, Filling -> Bottom, 
   FillingStyle -> Opacity[0.201, col], 
   PlotStyle -> Directive[Specularity[White, 400], Glow[Darker[col, 0.9]], Opacity[0.2], col], 
   Lighting -> {{"Ambient", Darker[col, 0.35]}, {"Directional", col2, {30, 30, 20}}},
   AxesLabel -> {x, y, z}, 
   ViewPoint -> {-2.1473148110909985`, -1.9225307125696098`, 1.7728267713727204`}];

img1 = Image@plot1;
img2 = Image[plot1 /. {Opacity[0.2] -> Opacity[1]}];

ixf = Compile[{{c1, _Real, 1}, {c2, _Real, 1}},
   With[{t = (1 - Sqrt@Abs[1 - (Norm[c2] - 1)]; (Norm[c2] - 1))^12},
    (1 - t) c1 + t*c2],
   RuntimeAttributes -> {Listable}, Parallelization -> True
   ];

Image[ixf[ImageData@img1, ImageData@img2], Options@img2]

enter image description here