2 * Copyright (c) 1993-1997, Silicon Graphics, Inc.
4 * Permission to use, copy, modify, and distribute this software for
5 * any purpose and without fee is hereby granted, provided that the above
6 * copyright notice appear in all copies and that both the copyright notice
7 * and this permission notice appear in supporting documentation, and that
8 * the name of Silicon Graphics, Inc. not be used in advertising
9 * or publicity pertaining to distribution of the software without specific,
10 * written prior permission.
12 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
13 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
14 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
15 * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
16 * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
17 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
18 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
19 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
20 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
21 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
22 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
23 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
25 * US Government Users Restricted Rights
26 * Use, duplication, or disclosure by the Government is subject to
27 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
28 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
29 * clause at DFARS 252.227-7013 and/or in similar or successor
30 * clauses in the FAR or the DOD or NASA FAR Supplement.
31 * Unpublished-- rights reserved under the copyright laws of the
32 * United States. Contractor/manufacturer is Silicon Graphics,
33 * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
35 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
39 * Use the accumulation buffer to do full-scene antialiasing
40 * on a scene with perspective projection, using the special
41 * routines accFrustum() and accPerspective().
48 #define PI_ 3.14159265358979323846
51 * The first 6 arguments are identical to the glFrustum() call.
53 * pixdx and pixdy are anti-alias jitter in pixels.
54 * Set both equal to 0.0 for no anti-alias jitter.
55 * eyedx and eyedy are depth-of field jitter in pixels.
56 * Set both equal to 0.0 for no depth of field effects.
58 * focus is distance from eye to plane in focus.
59 * focus must be greater than, but not equal to 0.0.
61 * Note that accFrustum() calls glTranslatef(). You will
62 * probably want to insure that your ModelView matrix has been
63 * initialized to identity before calling accFrustum().
65 static void accFrustum(GLdouble left
, GLdouble right
, GLdouble bottom
,
66 GLdouble top
, GLdouble nnear
, GLdouble ffar
, GLdouble pixdx
,
67 GLdouble pixdy
, GLdouble eyedx
, GLdouble eyedy
, GLdouble focus
)
69 GLdouble xwsize
, ywsize
;
73 glGetIntegerv (GL_VIEWPORT
, viewport
);
75 xwsize
= right
- left
;
76 ywsize
= top
- bottom
;
78 dx
= -(pixdx
*xwsize
/(GLdouble
) viewport
[2] + eyedx
*nnear
/focus
);
79 dy
= -(pixdy
*ywsize
/(GLdouble
) viewport
[3] + eyedy
*nnear
/focus
);
81 glMatrixMode(GL_PROJECTION
);
83 glFrustum (left
+ dx
, right
+ dx
, bottom
+ dy
, top
+ dy
, nnear
, ffar
);
84 glMatrixMode(GL_MODELVIEW
);
86 glTranslatef (-eyedx
, -eyedy
, 0.0);
91 * The first 4 arguments are identical to the gluPerspective() call.
92 * pixdx and pixdy are anti-alias jitter in pixels.
93 * Set both equal to 0.0 for no anti-alias jitter.
94 * eyedx and eyedy are depth-of field jitter in pixels.
95 * Set both equal to 0.0 for no depth of field effects.
97 * focus is distance from eye to plane in focus.
98 * focus must be greater than, but not equal to 0.0.
100 * Note that accPerspective() calls accFrustum().
102 static void accPerspective(GLdouble fovy
, GLdouble aspect
,
103 GLdouble nnear
, GLdouble ffar
, GLdouble pixdx
, GLdouble pixdy
,
104 GLdouble eyedx
, GLdouble eyedy
, GLdouble focus
)
106 GLdouble fov2
,left
,right
,bottom
,top
;
108 fov2
= ((fovy
*PI_
) / 180.0) / 2.0;
110 top
= nnear
/ (cos(fov2
) / sin(fov2
));
113 right
= top
* aspect
;
116 accFrustum (left
, right
, bottom
, top
, nnear
, ffar
,
117 pixdx
, pixdy
, eyedx
, eyedy
, focus
);
120 /* Initialize lighting and other values.
122 static void init(void)
124 GLfloat mat_ambient
[] = { 1.0, 1.0, 1.0, 1.0 };
125 GLfloat mat_specular
[] = { 1.0, 1.0, 1.0, 1.0 };
126 GLfloat light_position
[] = { 0.0, 0.0, 10.0, 1.0 };
127 GLfloat lm_ambient
[] = { 0.2, 0.2, 0.2, 1.0 };
129 glMaterialfv(GL_FRONT
, GL_AMBIENT
, mat_ambient
);
130 glMaterialfv(GL_FRONT
, GL_SPECULAR
, mat_specular
);
131 glMaterialf(GL_FRONT
, GL_SHININESS
, 50.0);
132 glLightfv(GL_LIGHT0
, GL_POSITION
, light_position
);
133 glLightModelfv(GL_LIGHT_MODEL_AMBIENT
, lm_ambient
);
135 glEnable(GL_LIGHTING
);
137 glEnable(GL_DEPTH_TEST
);
138 glShadeModel (GL_FLAT
);
140 glClearColor(0.0, 0.0, 0.0, 0.0);
141 glClearAccum(0.0, 0.0, 0.0, 0.0);
144 static void displayObjects(void)
146 GLfloat torus_diffuse
[] = { 0.7, 0.7, 0.0, 1.0 };
147 GLfloat cube_diffuse
[] = { 0.0, 0.7, 0.7, 1.0 };
148 GLfloat sphere_diffuse
[] = { 0.7, 0.0, 0.7, 1.0 };
149 GLfloat octa_diffuse
[] = { 0.7, 0.4, 0.4, 1.0 };
152 glTranslatef (0.0, 0.0, -5.0);
153 glRotatef (30.0, 1.0, 0.0, 0.0);
156 glTranslatef (-0.80, 0.35, 0.0);
157 glRotatef (100.0, 1.0, 0.0, 0.0);
158 glMaterialfv(GL_FRONT
, GL_DIFFUSE
, torus_diffuse
);
159 glutSolidTorus (0.275, 0.85, 16, 16);
163 glTranslatef (-0.75, -0.50, 0.0);
164 glRotatef (45.0, 0.0, 0.0, 1.0);
165 glRotatef (45.0, 1.0, 0.0, 0.0);
166 glMaterialfv(GL_FRONT
, GL_DIFFUSE
, cube_diffuse
);
171 glTranslatef (0.75, 0.60, 0.0);
172 glRotatef (30.0, 1.0, 0.0, 0.0);
173 glMaterialfv(GL_FRONT
, GL_DIFFUSE
, sphere_diffuse
);
174 glutSolidSphere (1.0, 16, 16);
178 glTranslatef (0.70, -0.90, 0.25);
179 glMaterialfv(GL_FRONT
, GL_DIFFUSE
, octa_diffuse
);
180 glutSolidOctahedron ();
188 static void display(void)
193 glGetIntegerv (GL_VIEWPORT
, viewport
);
195 glClear(GL_ACCUM_BUFFER_BIT
);
196 for (jitter
= 0; jitter
< ACSIZE
; jitter
++) {
197 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
198 accPerspective (50.0,
199 (GLdouble
) viewport
[2]/(GLdouble
) viewport
[3],
200 1.0, 15.0, j8
[jitter
].x
, j8
[jitter
].y
, 0.0, 0.0, 1.0);
202 glAccum(GL_ACCUM
, 1.0/ACSIZE
);
204 glAccum (GL_RETURN
, 1.0);
208 static void reshape(int w
, int h
)
210 glViewport(0, 0, (GLsizei
) w
, (GLsizei
) h
);
214 static void keyboard(unsigned char key
, int x
, int y
)
224 * Be certain you request an accumulation buffer.
226 int main(int argc
, char** argv
)
228 glutInit(&argc
, argv
);
229 glutInitDisplayMode (GLUT_SINGLE
| GLUT_RGB
230 | GLUT_ACCUM
| GLUT_DEPTH
);
231 glutInitWindowSize (250, 250);
232 glutInitWindowPosition (100, 100);
233 glutCreateWindow (argv
[0]);
235 glutReshapeFunc(reshape
);
236 glutDisplayFunc(display
);
237 glutKeyboardFunc(keyboard
);