The quality of $\operatorname{Arg}f$ was fine in the DensityPlot using the same quality parameters, but it's awful when I make it a ColorFunction. I suppose this is because the surface mesh is made from $|f|$ in the Plot3D and not from $\operatorname{Arg}f$ as it was in the DensityPlot, and $|f|$ isn't changing very much around the important parts of $\operatorname{Arg}f$ which is why it looks so choppy and noticable.

So, how do I fix this? Is there a way to give the ColorFunction more PlotPoints than the actual surface, or perhaps a different mesh? If possible I want to avoid just increasing PlotPoints for the overall plot, as I am happy with the quality of $|f|$ here, and it can be very slow to render as it is.

3 Answers
3

There is indeed an alternative which you might should consider. You almost got it yourself by the given analysis of the situation in your question. While Plot3D does only care of a good resolution of the function you plot and not the function you use for coloring, DensityPlot uses your color function from the beginning and tries to resolve this as best as possible.

Therefore, one possible way is to use the DensityPlot image as texture on your surface.

You can add Arg[f] explicitly in the function to plot with ridiculously small coefficient. Then Mathematica will render points as you wish. Also it is good idea to put ExclusionStyle->Automatic to get rid of white lines. Below is your code with these corrections:

Mathematica is a registered trademark of Wolfram Research, Inc. While the mark is used herein with the limited permission of Wolfram Research, Stack Exchange and this site disclaim all affiliation therewith.