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

OpenGL

开发平台:

Visual C++

  1. //  本程序演示了如何使用光照和材质 #include <stdlib.h> #include <GL/glut.h> //  初始化z缓冲区,投影矩阵,光源和光照模型 void init(void) {    GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };    GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };    GLfloat specular[] = { 1.0, 1.0, 1.0, 1.0 };    GLfloat position[] = { 0.0, 3.0, 2.0, 0.0 };    GLfloat lmodel_ambient[] = { 0.4, 0.4, 0.4, 1.0 };    GLfloat local_view[] = { 0.0 };    glClearColor(0.0, 0.1, 0.1, 0.0);    glEnable(GL_DEPTH_TEST);    glShadeModel(GL_SMOOTH);    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);    glLightfv(GL_LIGHT0, GL_POSITION, position);    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);    glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local_view);    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0); } void display(void) {    GLfloat no_mat[] = { 0.0, 0.0, 0.0, 1.0 };    GLfloat mat_ambient[] = { 0.7, 0.7, 0.7, 1.0 };    GLfloat mat_ambient_color[] = { 0.8, 0.8, 0.2, 1.0 };    GLfloat mat_diffuse[] = { 0.1, 0.5, 0.8, 1.0 };    GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };    GLfloat no_shininess[] = { 0.0 };    GLfloat low_shininess[] = { 5.0 };    GLfloat high_shininess[] = { 100.0 };    GLfloat mat_emission[] = {0.3, 0.2, 0.2, 0.0};    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  2.    //  绘制第一行第一列的球体,只有漫反射,没有环境光或镜面反射光
  3.    glPushMatrix();    glTranslatef (-3.75, 3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  4.    //  绘制第一行第二列的球体,有镜面反射和镜面反射,低光泽度,无环境光    glPushMatrix();    glTranslatef (-1.25, 3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  5.    //  绘制第一行第三列的球体,有漫反射和镜面反射,高光泽度,无环境光    glPushMatrix();    glTranslatef (1.25, 3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  6.    //  绘制第一行第四列的球体,有漫反射和发射光,无环境光或镜面反射光    glPushMatrix();    glTranslatef (3.75, 3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  7.    //  绘制第二行第一列的球体,有环境光和漫反射光,无镜面反射光    glPushMatrix();    glTranslatef (-3.75, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  8.    //  绘制第二行第二列的球体,有环境光、漫反射和镜面反射光,低光泽度    glPushMatrix();    glTranslatef (-1.25, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  9.    //  绘制第二行第三列的球体,有环境光、漫反射和镜面反射光,高光泽度    glPushMatrix();    glTranslatef (1.25, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  10.    //  绘制第二行第四列的球体,有环境光、漫反射和发射光,无镜面反射光    glPushMatrix();    glTranslatef (3.75, 0.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    //  绘制第三行第一列的球体,有颜色环境光、漫反射,无镜面反射光    glPushMatrix();    glTranslatef (-3.75, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    //  绘制第三行第二列的球体,有颜色环境光、漫反射和无镜面反射光,无光泽度    glPushMatrix();    glTranslatef (-1.25, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, low_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();
  11.    //  绘制第三行第三列的球体,有颜色环境光、漫反射和镜面反射光,高光泽度    glPushMatrix();    glTranslatef (1.25, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    //  绘制第三行第四列的球体,有颜色环境光、漫反射和发射光,无镜面反射光    glPushMatrix();    glTranslatef (3.75, -3.0, 0.0);    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_color);    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);    glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);    glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);    glutSolidSphere(1.0, 16, 16);    glPopMatrix();    glFlush(); } void reshape(int w, int h) {    glViewport(0, 0, w, h);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    if (w <= (h * 2))       glOrtho (-6.0, 6.0, -3.0*((GLfloat)h*2)/(GLfloat)w,           3.0*((GLfloat)h*2)/(GLfloat)w, -10.0, 10.0);    else       glOrtho (-6.0*(GLfloat)w/((GLfloat)h*2),           6.0*(GLfloat)w/((GLfloat)h*2), -3.0, 3.0, -10.0, 10.0);    glMatrixMode(GL_MODELVIEW);    glLoadIdentity(); } void keyboard(unsigned char key, int x, int y) {    switch (key) {       case 27:          exit(0);          break;    } } int main(int argc, char** argv) {    glutInit(&argc, argv);    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);    glutInitWindowSize (600, 450);    glutCreateWindow(argv[0]);    init();    glutReshapeFunc(reshape);    glutDisplayFunc(display);    glutKeyboardFunc (keyboard);    glutMainLoop();    return 0;  }