#include<windows.h>
#include<gl/glut.h>
#include<math.h>
#define x_Screen 800
#define y_Screen 600
#define little 50
#define middle 20
#define large 8
void myBackground()
{
glClearColor(0.0,0.0,0.0,1.0);
glColor3f(1.0,1.0,1.0);
}
void myDisplay()
{
glEnable ( GL_DEPTH_TEST );
//如果没有抗锯齿,则点为方形的。如果我们启动抗锯齿设置,则点是一个圆点。
glEnable(GL_POINT_SMOOTH);
glEnable(GL_LINE_SMOOTH);
glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); // Make round points, not square points
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Antialias the lines
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
int i;
glBegin(GL_POINTS);
for(i=0;i<little;i++)
glVertex2f(50.0+rand()%x_Screen,50.0+rand()%y_Screen);
glEnd();
glPointSize(2);
glBegin(GL_POINTS);
for(i=0;i<middle;i++)
glVertex2f(50.0+rand()%x_Screen,50.0+rand()%y_Screen);
glEnd();
glPointSize(8);
glBegin(GL_POINTS);
for(i=0;i<large;i++)
glVertex2f(50.0+rand()%x_Screen,50.0+rand()%y_Screen);
glEnd();
glBegin(GL_POLYGON);
for(i=0;i<64;i++)
glVertex2f(600+50.0*cos((float)i/10) ,500+50.0*sin((float)i/10) );
glEnd();
glLineWidth(3);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
glEnable(GL_LINE_SMOOTH);
glBegin(GL_LINE_STRIP);
for(i=0;i<19;i++){
glVertex2f(rand()%10+i*70,rand()%50+50.0+(i%2)*80);
}
glEnd();
glutSwapBuffers();
}
void myChange(int w,int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0,x_Screen,0.0,y_Screen);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void main()
{
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH);
glutInitWindowSize(x_Screen,y_Screen);
glutCreateWindow("Star");
glutDisplayFunc(myDisplay);
glutReshapeFunc(myChange);
myBackground();
glutMainLoop();
}
6.OpenGL的反走样实例2---线的反走样
#include <GL/glut.h>
#include <stdio.h>
static float rotAngle = 0.;
void init(void)
{
GLfloat values[2];
glGetFloatv(GL_LINE_WIDTH_GRANULARITY, values);
printf("GL_LINE_WIDTH_GRANULARITY value is %3.1f\n", values[0]);
glGetFloatv(GL_LINE_WIDTH_RANGE, values);
printf("GL_LINE_WIDTH_RANGE values are %3.1f %3.1f\n", values[0], values[1]);
glEnable(GL_LINE_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE);
glLineWidth(1.5);
glClearColor(0.0, 0.0, 0.0, 0.0);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0, 1.0, 0.0);
glPushMatrix();
glRotatef(-rotAngle, 0.0, 0.0, 0.1);
glBegin(GL_LINES);
glVertex2f(-0.5, 0.5);
glVertex2f(0.5, -0.5);
glEnd();
glPopMatrix();
glColor3f(0.0, 0.0, 1.0);
glPushMatrix();
glRotatef(rotAngle, 0.0, 0.0, 0.1);
glBegin(GL_LINES);
glVertex2f(0.5, 0.5);
glVertex2f(-0.5, -0.5);
glEnd();
glPopMatrix();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
gluOrtho2D (-1.0, 1.0, -1.0*(GLfloat)h/(GLfloat)w, 1.0*(GLfloat)h/(GLfloat)w);
else
gluOrtho2D (-1.0*(GLfloat)w/(GLfloat)h, 1.0*(GLfloat)w/(GLfloat)h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case ‘r‘: case ‘R‘:
rotAngle += 20.;
if (rotAngle >= 360.0) rotAngle = 0.0;
glutPostRedisplay();
break;
case 27:
exit(0);
break;
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(200, 200);
glutCreateWindow(argv[0]);
init();
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}