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`}]
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]
Texture
is welcome! $\endgroup$Plot3D[Sin[x + Sin[y]], {x, 0, 2 Pi}, {y, 0, 2 Pi}, BoundaryStyle -> None, Lighting -> "Neutral", Mesh -> None, PlotPoints -> 45, PlotTheme -> "Classic", PlotStyle -> Directive[Opacity[0.8, ColorData["Legacy", "PowderBlue"]]]]
orPlot3D[Sin[x + Sin[y]], {x, 0, 2 Pi}, {y, 0, 2 Pi}, BoundaryStyle -> None, ColorFunction -> "DeepSeaColors", Lighting -> "Neutral", Mesh -> None, PlotPoints -> 45, PlotStyle -> Opacity[0.6], PlotTheme -> "Classic"]
$\endgroup$