OSDN Git Service

improved AA subpixel sample positions (Ray Tice)
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 13 Nov 2001 00:26:39 +0000 (00:26 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 13 Nov 2001 00:26:39 +0000 (00:26 +0000)
src/mesa/swrast/s_aatriangle.c

index 83f145c..5f0a5c7 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: s_aatriangle.c,v 1.19 2001/09/19 20:30:44 kschultz Exp $ */
+/* $Id: s_aatriangle.c,v 1.20 2001/11/13 00:26:39 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.0.1
  *
  * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
  *
@@ -142,27 +142,43 @@ static GLfloat
 compute_coveragef(const GLfloat v0[3], const GLfloat v1[3],
                   const GLfloat v2[3], GLint winx, GLint winy)
 {
-#define B 0.125
+   /* Given a position [0,3]x[0,3] return the sub-pixel sample position.
+    * Contributed by Ray Tice.
+    *
+    * Jitter sample positions -
+    * - average should be .5 in x & y for each column
+    * - each of the 16 rows and columns should be used once
+    * - the rectangle formed by the first four points
+    *   should contain the other points
+    * - the distrubition should be fairly even in any given direction
+    *
+    * The pattern drawn below isn't optimal, but it's better than a regular
+    * grid.  In the drawing, the center of each subpixel is surrounded by
+    * four dots.  The "x" marks the jittered position relative to the
+    * subpixel center.
+    */
+#define POS(a, b) (0.5+a*4+b)/16
    static const GLfloat samples[16][2] = {
       /* start with the four corners */
-      { 0.00+B, 0.00+B },
-      { 0.75+B, 0.00+B },
-      { 0.00+B, 0.75+B },
-      { 0.75+B, 0.75+B },
+      { POS(0, 2), POS(0, 0) },
+      { POS(3, 3), POS(0, 2) },
+      { POS(0, 0), POS(3, 1) },
+      { POS(3, 1), POS(3, 3) },
       /* continue with interior samples */
-      { 0.25+B, 0.00+B },
-      { 0.50+B, 0.00+B },
-      { 0.00+B, 0.25+B },
-      { 0.25+B, 0.25+B },
-      { 0.50+B, 0.25+B },
-      { 0.75+B, 0.25+B },
-      { 0.00+B, 0.50+B },
-      { 0.25+B, 0.50+B },
-      { 0.50+B, 0.50+B },
-      { 0.75+B, 0.50+B },
-      { 0.25+B, 0.75+B },
-      { 0.50+B, 0.75+B }
+      { POS(1, 1), POS(0, 1) },
+      { POS(2, 0), POS(0, 3) },
+      { POS(0, 3), POS(1, 3) },
+      { POS(1, 2), POS(1, 0) },
+      { POS(2, 3), POS(1, 2) },
+      { POS(3, 2), POS(1, 1) },
+      { POS(0, 1), POS(2, 2) },
+      { POS(1, 0), POS(2, 1) },
+      { POS(2, 1), POS(2, 3) },
+      { POS(3, 0), POS(2, 0) },
+      { POS(1, 3), POS(3, 0) },
+      { POS(2, 2), POS(3, 2) }
    };
+
    const GLfloat x = (GLfloat) winx;
    const GLfloat y = (GLfloat) winy;
    const GLfloat dx0 = v1[0] - v0[0];
@@ -226,28 +242,25 @@ static GLint
 compute_coveragei(const GLfloat v0[3], const GLfloat v1[3],
                   const GLfloat v2[3], GLint winx, GLint winy)
 {
-   /* NOTE: 15 samples instead of 16.
-    * A better sample distribution could be used.
-    */
+   /* NOTE: 15 samples instead of 16. */
    static const GLfloat samples[15][2] = {
       /* start with the four corners */
-      { 0.00+B, 0.00+B },
-      { 0.75+B, 0.00+B },
-      { 0.00+B, 0.75+B },
-      { 0.75+B, 0.75+B },
+      { POS(0, 2), POS(0, 0) },
+      { POS(3, 3), POS(0, 2) },
+      { POS(0, 0), POS(3, 1) },
+      { POS(3, 1), POS(3, 3) },
       /* continue with interior samples */
-      { 0.25+B, 0.00+B },
-      { 0.50+B, 0.00+B },
-      { 0.00+B, 0.25+B },
-      { 0.25+B, 0.25+B },
-      { 0.50+B, 0.25+B },
-      { 0.75+B, 0.25+B },
-      { 0.00+B, 0.50+B },
-      { 0.25+B, 0.50+B },
-      /*{ 0.50, 0.50 },*/
-      { 0.75+B, 0.50+B },
-      { 0.25+B, 0.75+B },
-      { 0.50+B, 0.75+B }
+      { POS(1, 1), POS(0, 1) },
+      { POS(2, 0), POS(0, 3) },
+      { POS(0, 3), POS(1, 3) },
+      { POS(1, 2), POS(1, 0) },
+      { POS(2, 3), POS(1, 2) },
+      { POS(3, 2), POS(1, 1) },
+      { POS(0, 1), POS(2, 2) },
+      { POS(1, 0), POS(2, 1) },
+      { POS(2, 1), POS(2, 3) },
+      { POS(3, 0), POS(2, 0) },
+      { POS(1, 3), POS(3, 0) }
    };
    const GLfloat x = (GLfloat) winx;
    const GLfloat y = (GLfloat) winy;