SPMULGHT.C
上传用户:tengyuc
上传日期:2007-08-14
资源大小:722k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. //  本程序中使用了两个光源,一个是标准的蓝色光源,另一个是红色的聚光灯
  2. #include <windows.h>
  3. #pragma warning(disable : 4305) 
  4. #include <GL/gl.h>
  5. #include <GL/glu.h>
  6. #include <GL/glaux.h>
  7. void myinit(void);
  8. void CALLBACK myReshape(GLsizei w, GLsizei h);
  9. void CALLBACK display(void);
  10. //  初始化材质特性、光源、光照模型和深度缓冲区
  11. void myinit(void)
  12. {
  13. GLfloat mat_ambient[]= { 0.2, 0.2, 0.2, 1.0 };
  14. GLfloat mat_diffuse[]= { 0.8, 0.8, 0.8, 1.0 };
  15.     GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
  16.     GLfloat mat_shininess[] = { 50.0 };
  17.     GLfloat light0_diffuse[]= { 0.0, 0.0, 1.0, 1.0};
  18.     GLfloat light0_position[] = { 1.0, 1.0, 1.0, 0.0 };
  19.     GLfloat light1_ambient[]= { 0.2, 0.2, 0.2, 1.0 };
  20. GLfloat light1_diffuse[]= { 1.0, 0.0, 0.0, 1.0 };
  21.     GLfloat light1_specular[] = { 1.0, 0.6, 0.6, 1.0 };
  22.     GLfloat light1_position[] = { -3.0, -3.0, 3.0, 1.0 };
  23. GLfloat spot_direction[]={ 1.0,1.0,-1.0};
  24. glMaterialfv(GL_FRONT, GL_AMBIENT,  mat_ambient);
  25.     glMaterialfv(GL_FRONT, GL_DIFFUSE,  mat_diffuse);
  26.     glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  27.     glMaterialfv(GL_FRONT, GL_SHININESS,mat_shininess);
  28. glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
  29. glLightfv(GL_LIGHT0, GL_POSITION,light0_position);
  30. glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
  31. glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
  32. glLightfv(GL_LIGHT1, GL_SPECULAR,light1_specular);
  33. glLightfv(GL_LIGHT1, GL_POSITION,light1_position);
  34. glLightf (GL_LIGHT1, GL_SPOT_CUTOFF,   30.0);
  35. glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION,spot_direction);
  36.     glEnable(GL_LIGHTING);
  37.     glEnable(GL_LIGHT0);
  38.     glEnable(GL_LIGHT1);
  39.     glDepthFunc(GL_LESS);
  40.     glEnable(GL_DEPTH_TEST);
  41. }
  42. void CALLBACK display(void)
  43. {
  44.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  45.     glPushMatrix();
  46.     glTranslated (-3.0, -3.0, 3.0);
  47.     glDisable (GL_LIGHTING);
  48.     glColor3f (1.0, 0.0, 0.0);
  49.     auxWireCube (0.1);
  50.     glEnable (GL_LIGHTING);
  51.     glPopMatrix ();
  52.     auxSolidSphere(2.0);
  53.     glFlush();
  54. }
  55. void CALLBACK myReshape(GLsizei w, GLsizei h)
  56. {
  57.     glViewport(0, 0, w, h);
  58.     glMatrixMode(GL_PROJECTION);
  59.     glLoadIdentity();
  60.     if (w <= h) 
  61.     glOrtho (-5.5, 5.5, -5.5*(GLfloat)h/(GLfloat)w, 
  62. 5.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
  63.     else 
  64.     glOrtho (-5.5*(GLfloat)w/(GLfloat)h, 
  65. 5.5*(GLfloat)w/(GLfloat)h, -5.5, 5.5, -10.0, 10.0);
  66.     glMatrixMode(GL_MODELVIEW);
  67.     glLoadIdentity();
  68. }
  69. //  主函数,初始化窗口大小、RGBA显示模式和处理输入事件
  70. void main(void)
  71. {
  72.     auxInitDisplayMode (AUX_SINGLE | AUX_RGBA);
  73.     auxInitPosition (0, 0, 500, 500);
  74.     auxInitWindow ("位置光源和多光源演示");
  75.     myinit();
  76.     auxReshapeFunc (myReshape);
  77.     auxMainLoop(display);
  78. }