Antialiasing in 3D
John C. Turnbull
ozemale at ozemail.com.au
Sat Jul 20 13:05:07 PDT 2013
There has been recent discussion here regarding the 3D antialiasing options
in JavaFX 8.
For mine, there needs to be a way to specify both the *type* of AA (MSAA,
FSAA etc.) and also the *magnitude* (2x, 4x etc.). There also needs to be a
way for the application to determine the range of settings available on the
GPU so that it can select the particular options it wants (perhaps via user
Given this, I have some additional comments.
First, there seems to be 2 main approaches to applying AA to 3D scenes. The
first is what I am personally accustomed to in work I have done with OpenGL.
With this approach you pretty much write directly to the primary buffer and
thus allow the AA settings to be overridden by the driver configuration.
For example, on my Windows 7 machine which sports a high-end NVIDIA GPU, I
can go into the NVIDIA Control Panel and then fiddle with all manner of AA
and other 3D settings. I can choose anything from 2x to 32x with various
combinations of MS, SS and CS. The results of this tinkering are
immediately obvious and range from high-performance chunky graphics to
super-smooth graphics with very low frame rates. The point is that I the
user have full control over how the graphics are rendered and I get to
choose between performance and quality or a bit of both.
The other approach is where the scene or sub-scene is rendered into an
off-screen buffer. When the buffer is created, the AA settings (such as the
number of samples) are specified and this/these buffer(s) can then be
blasted onto the screen later. Here it is the developer who has full
control over the AA settings as with this approach the end user is unable to
override these settings in their GPU driver's "control panel".
Which of these approaches will be taken with JavaFX 8 3D? I am guessing
it's the second approach or a combination of both approaches.
I am especially curious because I have noticed some unusual things about 3D
on some platforms.
For example, on my iPhone I can play 3D games and they seem to perform very
well. What's really interesting to me is that the quality of the 3D
graphics is absolutely outstanding with barely a jaggie to be seen. I think
someone mentioned in the previous thread on JavaFX 3D and AA that only
levels of 2X MSAA were possible on most phones but if this is the case then
how do they get the graphics to be rendered with such high quality? I doubt
it's all about the retina display as I have seen equally smooth graphics on
some Android phones which do not have such high resolution screens.
Similarly, I find that the 3D graphics rendered via WebGL (on all platforms)
are also of a very high quality with seemingly no negative impact on
performance. In fact, on my Windows 7 machine I am unable to achieve the
same level of quality in my own OpenGL applications even when the highest
quality settings are configured in the NVIDIA Control Panel as is achieved
in many WebGL games on the same machine.
With both the iPhone and WebGL I find that tuning the settings in the
Control Panel has absolutely no effect on the quality of the rendered
graphics so I am very curious to know just how they can achieve the high
quality rendering and also if JavaFX can somehow "tap into" these techniques
Could someone from the JavaFX 3D team please comment on these observations?
More information about the openjfx-dev