Hello,
I want to learn some antialiasing effects, and read it in the red book. I tried the sample program, “multisamp.c,” in the book, but I couldn’t see any antialiasing from the results.
The query results from
glGetIntegerv(GL_SAMPLE_BUFFERS) and
glGetIntegerv(GL_SAMPLES) are both zeros. I guess that is the reason because according to the book, if the first value is “1,” and the second value is greater than “1,” then I’ll be able to use multisampling.
I am using a ATI mobility 9600 in my laptop. It supports OpenGL 2.0. I also adjust the settings in the control panel to force OpenGL use 2x antialiasing. But it doesn’t work.
Here is the code. Any ideas?
#include <stdlib.h>
#include <stdio.h>
#include <GL/glew.h>
#include <GL/glut.h>
static int bgtoggle = 1;
void init(void)
{
static GLint buf[1], sbuf[1];
int i, j;
glClearColor(0.0, 0.0, 0.0, 0.0);
glGetIntegerv (GL_SAMPLE_BUFFERS, buf);
printf ("number of sample buffers is %d
", buf[0]);
glGetIntegerv (GL_SAMPLES, sbuf);
printf ("number of samples is %d
", sbuf[0]);
glNewList (1, GL_COMPILE);
for (i = 0; i < 19; i++) {
glPushMatrix();
glRotatef(360.0*(float)i/19.0, 0.0, 0.0, 1.0);
glColor3f (1.0, 1.0, 1.0);
glLineWidth((i%3)+1.0);
glBegin (GL_LINES);
glVertex2f (0.25, 0.05);
glVertex2f (0.9, 0.2);
glEnd ();
glColor3f (0.0, 1.0, 1.0);
glBegin (GL_TRIANGLES);
glVertex2f (0.25, 0.0);
glVertex2f (0.9, 0.0);
glVertex2f (0.875, 0.10);
glEnd ();
glPopMatrix();
}
glEndList ();
glNewList (2, GL_COMPILE);
glColor3f (1.0, 0.5, 0.0);
glBegin (GL_QUADS);
for (i = 0; i < 16; i++) {
for (j = 0; j < 16; j++) {
if (((i + j) % 2) == 0) {
glVertex2f (-2.0 + (i * 0.25), -2.0 + (j * 0.25));
glVertex2f (-2.0 + (i * 0.25), -1.75 + (j * 0.25));
glVertex2f (-1.75 + (i * 0.25), -1.75 + (j * 0.25));
glVertex2f (-1.75 + (i * 0.25), -2.0 + (j * 0.25));
}
}
}
glEnd ();
glEndList ();
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
if (bgtoggle)
glCallList (2);
glEnable (GL_MULTISAMPLE);
glPushMatrix();
glTranslatef (-1.0, 0.0, 0.0);
glCallList (1);
glPopMatrix();
glDisable (GL_MULTISAMPLE);
glPushMatrix();
glTranslatef (1.0, 0.0, 0.0);
glCallList (1);
glPopMatrix();
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= (2 * h))
gluOrtho2D (-2.0, 2.0,
-2.0*(GLfloat)h/(GLfloat)w, 2.0*(GLfloat)h/(GLfloat)w);
else
gluOrtho2D (-2.0*(GLfloat)w/(GLfloat)h,
2.0*(GLfloat)w/(GLfloat)h, -2.0, 2.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key) {
case 'b':
case 'B':
bgtoggle = !bgtoggle;
glutPostRedisplay();
break;
case 27: /* Escape Key */
exit(0);
default:
break;
}
}
int main(int argc, char** argv)
{
glewInit();
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_MULTISAMPLE);
glutInitWindowSize (600, 300);
glutCreateWindow (argv[0]);
init();
glutReshapeFunc (reshape);
glutKeyboardFunc (keyboard);
glutDisplayFunc (display);
glutMainLoop();
return 0;
}