alphablend.c
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:4k
源码类别:

GIS编程

开发平台:

Visual C++

  1. #include <assert.h>
  2. #include <math.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <GL/glut.h>
  6. GLUquadricObj *cone, *base, *qsphere;
  7. void init(void)
  8. {
  9.     static GLfloat lightpos[] = {.5, .75, 1.5, 1};
  10.     glEnable(GL_DEPTH_TEST); 
  11.     glEnable(GL_LIGHTING);
  12.     glEnable(GL_LIGHT0);
  13.     glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
  14.     cone = gluNewQuadric();
  15.     base = gluNewQuadric();
  16.     qsphere = gluNewQuadric();
  17.     gluQuadricOrientation(base, GLU_INSIDE);
  18.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  19. }
  20. void reshape(GLsizei w, GLsizei h) 
  21. {
  22.     glViewport(0, 0, w, h);
  23.   
  24.     glMatrixMode(GL_PROJECTION);
  25.     glLoadIdentity();
  26.     gluPerspective(60, 1, .01, 10);
  27.     gluLookAt(0, 0, 2.577, 0, 0, -5, 0, 1, 0);
  28.   
  29.     glMatrixMode(GL_MODELVIEW);
  30.     glLoadIdentity();
  31. }
  32. void draw_room(void)
  33. {
  34.     /* material for the walls, floor, ceiling */
  35.     static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};
  36.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);
  37.     glBegin(GL_QUADS);
  38.   
  39.   /* floor */
  40.     glNormal3f(0, 1, 0);
  41.     glVertex3f(-1, -1, 1);
  42.     glVertex3f(1, -1, 1);
  43.     glVertex3f(1, -1, -1);
  44.     glVertex3f(-1, -1, -1);
  45.     /* ceiling */
  46.     glNormal3f(0, -1, 0);
  47.     glVertex3f(-1, 1, -1);
  48.     glVertex3f(1, 1, -1);
  49.     glVertex3f(1, 1, 1);
  50.     glVertex3f(-1, 1, 1);  
  51.     /* left wall */
  52.     glNormal3f(1, 0, 0);
  53.     glVertex3f(-1, -1, -1);
  54.     glVertex3f(-1, -1, 1);
  55.     glVertex3f(-1, 1, 1);
  56.     glVertex3f(-1, 1, -1);
  57.     /* right wall */
  58.     glNormal3f(-1, 0, 0);
  59.     glVertex3f(1, 1, -1);
  60.     glVertex3f(1, 1, 1);
  61.     glVertex3f(1, -1, 1);
  62.     glVertex3f(1, -1, -1);
  63.     /* far wall */
  64.     glNormal3f(0, 0, 1);
  65.     glVertex3f(-1, -1, -1);
  66.     glVertex3f(1, -1, -1);
  67.     glVertex3f(1, 1, -1);
  68.     glVertex3f(-1, 1, -1);
  69.     glEnd();
  70. }
  71. void draw_cone(void)
  72. {
  73.     static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};
  74.     glPushMatrix();
  75.     glTranslatef(0, -1, 0);
  76.     glRotatef(-90, 1, 0, 0);
  77.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);
  78.     gluCylinder(cone, .3, 0, 1.25, 20, 1);
  79.     gluDisk(base, 0., .3, 20, 1); 
  80.     glPopMatrix();
  81. }
  82. void draw_sphere(GLdouble angle)
  83. {
  84.     static GLfloat sphere_mat[] = {1.f, .5f, 0.f, .5f};
  85.     glPushMatrix();
  86.     glTranslatef(0, -.3, 0);
  87.     glRotatef(angle, 0, 1, 0);
  88.     glTranslatef(0, 0, .6);
  89.     glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
  90.     gluSphere(qsphere, .3, 20, 20);
  91.     glPopMatrix();
  92. }
  93. GLdouble get_secs(void)
  94. {
  95.     return glutGet(GLUT_ELAPSED_TIME)/1000.0;
  96. }
  97. void draw(void)
  98. {
  99.     GLenum err;
  100.     GLdouble secs;
  101.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  102.     draw_room();
  103.     draw_cone();
  104.     secs = get_secs();
  105.     glEnable(GL_BLEND);
  106.     glEnable(GL_CULL_FACE);
  107.     glCullFace(GL_FRONT);
  108.     draw_sphere(secs * 360. / 10.);
  109.     glCullFace(GL_BACK);
  110.     draw_sphere(secs * 360. / 10.);
  111.     glDisable(GL_CULL_FACE);
  112.     glDisable(GL_BLEND);
  113.     err = glGetError();
  114.     if (err != GL_NO_ERROR) printf("Error:  %sn", gluErrorString(err));
  115.     glutSwapBuffers();
  116. }
  117. /* ARGSUSED1 */
  118. void key(unsigned char key, int x, int y)
  119. {
  120.     static int idle = 1;
  121.     if (key == 27) exit(0);
  122.     idle = (idle == 0);
  123.     if (idle) {
  124. glutIdleFunc(draw);
  125.     } else {
  126. glutIdleFunc(0);
  127.     }
  128. }
  129. main(int argc, char *argv[])
  130. {
  131.     glutInitWindowSize(512, 512);
  132.     glutInitWindowPosition(0, 0);
  133.     glutInit(&argc, argv);
  134.     glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
  135.     glutCreateWindow(argv[0]);
  136.     glutDisplayFunc(draw);
  137.     glutIdleFunc(draw);
  138.     glutKeyboardFunc(key);
  139.     glutReshapeFunc(reshape);
  140.     init();
  141.     glutMainLoop();
  142.     return 0;
  143. }