[an error occurred while processing this directive] February 2002 3Digest: Anisotropic filtering research [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

February 2002 3Digest: Anisotropic filtering research

By Andrew Worobyew

It's widely known that NVIDIA GeForce256, GeForce2, GeForce3, GeForce4, ATI RADEON, RADEON 7500, RADEON 8500, STM KYRO, KYRO II chipsets support popular anisotropic filtering.

We've been writing about this feature for a year already. And that's no surprise as it significantly improves the quality of 3D scenes. I'll remind for short that MIP-mapping is used for removing artefacts like "sand" as the distance between textured objects and the viewer grows; it creates a number of copies (so-called MIP levels) with different detail levels for each texture that are chosen while scene is being drawn, depending on the scale of a drawn texture that is projected to the screen. The farther is a triangle, the less detail it will have and so the more dithered MIP-level will be used. This corresponds to our eyesight (we see close objects in more detail than far. Trilinear filtering smoothes borders between MIP-levels, by linear interpolation of two adjacent levels. So, bilinear filtering is used for removing sharp edges between texture pixels (for us to see the walls and floor textured not by squares, but by some smooth real-life materials), and trilinear filtering additionally dithers the scene once more interpolating edges of two bilinear-filtered MIP levels. As a result only the closest objects remain detailed. At that walls, positioned at sharp angles, are dithered too much. Anisotropic filtering is called to deal with these objects, "inconvenient" for bilinear and trilinear filtering. It allows to keep the clear picture of angled textures and doesn't allow texture "sand" at very far distances.

Let's this feature in action on the example of 3DMark2001 (Direct3D) and Serious Sam (OpenGL). All cards mentioned above support anisotropy, depending on games, and only some can force it independently. Almost all cards can do this without any tweaker utilities, i.e. the feature of anisotropy forcing is included into drivers. I must say that the check box responsible for this feature works incorrectly in NVIDIA drivers 21.* and older, and it doesn't allow to select filtering level (especially of GeForce3). Only 22.* versions and newer have this feature corrected, but I wrote about disadvantages of these drivers on the main page of 3Digest. So I recommend RivaTuner utility for setting parameters (including anisotropy) for NVIDIA-based cards.

Anisotropy in Direct3D: NVIDIA GeForce3/4 and ATI RADEON 8500

We know that different videoprocessors manufacturers realize this function differently. And speed characteristics of anisotropies of, for example, ATI and NVIDIA differ very much. It's the resulting quality that is similar.

Is it true? Our readers know that NVIDIA anisotropy (speaking about GeForce3) has high quality and excessive appetite. The perfomance falloff may be up to 50 %! ATI anisotropy (speaking about RADEON 8500) is much "cheaper" and, as we thought until recently, has similar quality.

As usually, anisotropy quality is estimated by examples of walls, floors, squares, etc. Readers see sharp lines and enjoy it. But vigilant readers could notice that not everything is all right with Canadian card. On some differently angled surfaces, with angles not equal to 90 degrees, RADEON 8500 simply does not render anisotropy. Look at screenshots, taken in Serious Sam while viewer was turning relative to a wall:

ATI RADEON 8500

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive]

NVIDIA GeForce4

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]
[an error occurred while processing this directive][an error occurred while processing this directive]

I have made animated GIFs for your convenience:

ATI RADEON 8500 NVIDIA GeForce4

There's obviously no picture clearness with RADEON 8500 at a number of viewing angles. Is it the reason of ATI's anisotropy calculation cheapness? And NVIDIA GeForce3 and GeForce4 have everything "fair", if, certainly, it is possible to count realization of this function as fair and dishonest. It is bad, that manufacturers do not give users a conscious choice: to use the fair anisotropy with big resource losses or the cheaper "approximation". Now such choice may be made only indirectly - by choosing a card.

And still it is impossible to directly operate with the concept of anisotropy "honesty". If we may strictly estimate trilinear filtering, as its algorithm is unequivocal and well described, the anisotropic filtering technology is not disclosed by manufacturers, and there are about five basic approaches for it. That is so if you don't consider the nuances! Let's pause on how two companies perform this function in detail.

The differences of NVIDIA and ATI approaches to anisotropic filtering realization

If bilinear and trilinear filterings are precisely enough defined mathematically (however, in due time this didn't stop NVIDIA from calling trilinear filtering a certain method of approximation in some documents - the dithering of different MIP levels values), the term "anisotropic filtering" does not mean any exact algorithms of realization. NVIDIA and ATI approaches are essentially different. Let's get schematically acquainted with them: [an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

NVIDIA is rather straightforward. The figure shows how bilinear samples are selected in texture space during anisotropic filtering. Depending on filtering quality settings and surface viewing angle relative to screen plane, the standard bi- (or tri-) linear filtering is performed 1-4 times for points located on a straight line, drawn along dividing pixel, projected from the screen to texture surface along its long side (represented by an arrow on the figure). The values received this way (blue circles) are averaged and become the result of filtering. Each value is based on four nearest discrete texture values (rectangles) and may have its own independent coordinates. Such approach suits arbitrary positioned textures, but demands high perfomance - the number of chosen texture samples, and, accordingly, fill time grows by several times for an appreciable part of triangles unparallel to the screen.

ATI's approach is more limited, but also more performing: [an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

As we see, values are being chosen as a chain, that may be positioned strictly horizontally or vertically in the texture plane. I.e. filtering quality will be high for values of projecting vector that are close to orts (an arrow on the figure), but as it turns, the effect will be still smaller down to the full loss of sense in using such method. It will be shown as follows in real applications - filtering will fully work for walls or ceilings, but for surfaces, that are not right-angled; the result will be smaller and smaller, while approaching the critical angle of 45 degrees (that we can observe above). But, on the other hand, such approach is much more favourable from the computing point of view. First, we choose organized chains of at least 2xN texture points in size (small squares on the figure) that can be effectively chosen for N/2 clocks with the help of standard texture blocks designed for bilinear filtering. Then, we filter values (circles on the figure), each time using the same offset of discrete points relative to the initial texture. Such operation may be performed for one clock by a special scheme of ten multipliers, built into the texture block, as the value of interpolation parameters is calculated once and remains the same for all 1..5 calculated points. Besides we may essentially speed up this already productive algorithm, having calculated texture variants, specially compressed on axes, beforehand (the so-called RIP mapping).

Summarizing the aforesaid, we shall note that NVIDIA approach demands greater time for result calculation, but it is also more "fair", dealing good with both objects located at any angles to the viewer, not just horizontally or vertically. ATI method has sense as well - the majority of modern games is generally full of horizontal and vertical surfaces.

Until recently the trump of GeForce GPUs was the capability of forcing anisotropy in Direct3D (certainly, unofficially, by changing Registry settings or with the same RivaTuner). RADEON-based cards lacked this feature and had to be satisfied with games using it.

But RADEONs obtained this feature in 9.003 (for Windows 9x/ME) and 6.006 drivers (for Windows 2000/XP). Unofficially (for versions below 9.012), by changing Registry settings: [an error occurred while processing this directive][an error occurred while processing this directive]

Pay your attention to the value in the left field, marked red. It may vary from one computer to another; so first ensure you're in the right place in the Registry. You'll have to create AnisoDegree variable and set it to 4,16,64,128. I must say that the highest level is 16, as results of higher values are the same as results of using x16. 9.012 and higher version drivers provide usual settings of anisotropy perfomance in Direct3D.

We've examined the perfomance of a number of cards at active anisotropy, inclidung not only NVIDIA and ATI products, but also STM/PowerVR KYRO II. So, here's it:

3DMark2001


[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

As you can see, KYRO II is the perfomance drop leader. However, we've already written about it in our reviews: this function of KYRO/KYRO II is undemanded exactly due to such catastrophic perfomance drop. Then there goes GeForce4 Ti, and GeForce3 Ti 500 is almost at the same level. It's interesting that sometimes the former shows less falloff than Ti 500. And we've recently written in the GeForce4 Ti review that such low perfomance almost erases all advantages between GeForce4 Ti and GeForce3 Ti 500. But the situation got better with the newer drivers.

Note that the perfomance falloff of RADEON 8500 at the highest anisotropy, though being the deepest of all ATI GPUs, is smaller than that of GeForce3/4 almost everywhere. And RADEON 7500 "performed" well, having lost almost nothing.

I want to attract your attention to that LOD BIAS value is biased to higher texture quality on RADEON 8500 in Direct3D, so at disabled anisotropy the clearness seems to be better than that of GeForce3. But that's only for screenshots, as such a push of LOD BIAS results in "texture noise", showing up as flashing dots - so-called "sand".

I recommend you to read our reviews about anisotropic filtering for more details about quality you can have with the different cards after enabling this feature.

And now let's proceed to OpenGL and the Serious Sam test.

OpenGL anisotropy on the example of Serious Sam

First, let's look at perfomance losses of a number of cards after forcing anisotropy filtering: [an error occurred while processing this directive][an error occurred while processing this directive]

We see such an exceptional picture, when the speed of GeForce4 MX440 with anisotropy enabled is even higher than when it's disabled. We couldn't explain this, as it remained the same after 5 tests (so not being an error). From other angles the picture is alike the previous 3DMark2001 tests, except for that GeForce4Ti's perfomance drop is equal or deeper than GeForce3 Ti 500's.

Now, let's shortly observe anisotropy quality. First, let's look at the "reference" screenshot demonstrating... the absense of anisotropy, where trilinear filtering rules (Voodoo fans will be awfully glad to see such a floor :-).

trilinear filtering:

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

And now let's see how every chip realizes anisotropic filtering.

STM KYRO / KYRO II

anisotropic filtering:

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

As we see, this anisotropy does not produce good quality, having 'voracious appetite'. This proves this functions to be unclaimed (as no one will play a game with 15 FPS, getting doubtful quality growth).

ATI RADEON

anisotropy (High level):

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

Looking at screens above it's clear that intermediate High level is senseless and you should use only the Highest. It produces really nice quality, by the way! However, maximum anisotropy provides an artefact with the dithered MIP-level approaching. [an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

ATI RADEON 7500

anisotropy (High level):

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

As this card is just an overclocked RADEON, no changes are expected what is proved by the screenshot.

ATI RADEON 8500

anisotropy (High level):

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

We can see the same fine quality of this card as that of its predecessors. Perfomance falloffs become noticable in high resolutions only. But they are still less deep than those of NVIDIA GeForce3. But you shouldn't forget aforesaid about the absence (or lowered quality) of anisotropy on sharp angles close to 45. So, it's impossible to give it a simple mark.

NVIDIA GeForce2 Pro/Ti

anisotropic filtering (Level 2): [an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

Though perfomance of these cards suffers very little after activating anisotropy, its quality is far worse than RADEON's.

NVIDIA GeForce3 / GeForce4

anisotropic filtering (Level 2 - like GeForce4 MX):

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

Anisotropic filtering (Level 4):

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

Anisotropic filtering (Level 8):

[an error occurred while processing this directive][an error occurred while processing this directive]

[an error occurred while processing this directive][an error occurred while processing this directive]

Level 8 anisotropy is certainly the best, but you should remember about the perfomance drop. And again I'll note the tendency of changing the situation when the perfomance drop of GeForce4 Ti is deeper than that of GeForce3 Ti 500 without any obvious reasons. [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]