Chinaunix首页 | 论坛 | 博客
  • 博客访问: 10645
  • 博文数量: 8
  • 博客积分: 335
  • 博客等级: 一等列兵
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-26 20:11
文章分类

全部博文(8)

文章存档

2008年(8)

我的朋友
最近访客

分类: C/C++

2008-10-25 20:26:13

#include
#include
#include
#include

GLfloat angle =0.0;
GLfloat theta =0.0,vp=30.0;




typedef int edge[2];
typedef int face[4];
typedef GLfloat point3[3];



#define TEX_WIDTH 128
#define TEX_HEIGHT 128
static GLubyte texImage[TEX_WIDTH][TEX_HEIGHT][4];
static GLuint texName[1];

int myWin,w,h;
void myinit(void){
    
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.6,0.6,0.6,1.0);

    point3 direction0={-1.0,-1.0,-1.0};
    point3 direction1={1.0,1.0,1.0};
    point3 direction2={1.0,1.0,-1.0};
   
    GLfloat light_pos0[]={2.0,2.0,2.0,1.0};
    GLfloat light_col0[]={1.0,0.0,0.0,1.0};
    GLfloat amb_col0[]={0.3,0.0,0.0,1.0};


    GLfloat light_pos1[]={-2.0,-2.0,-2.0,1.0};
    GLfloat light_col1[]={0.0,1.0,0.0,1.0};
    GLfloat amb_col1[]={0.0,0.3,0.0,1.0};


    GLfloat light_pos2[]={-2.0,-2.0,2.0,1.0};
    GLfloat light_col2[]={0.0,0.0,1.0,1.0};
    GLfloat amb_col2[]={0.0,0.0,10.3,.0};


    glLightfv(GL_LIGHT0,GL_POSITION,light_pos0);
    glLightfv(GL_LIGHT0,GL_AMBIENT,amb_col0);
    glLightfv(GL_LIGHT0,GL_SPECULAR,light_col0);

    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION,direction0);
    glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,50.0);
    glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,2.0);

    glLightfv(GL_LIGHT1,GL_POSITION,light_pos1);
    glLightfv(GL_LIGHT1,GL_AMBIENT,amb_col1);
    glLightfv(GL_LIGHT1,GL_SPECULAR,light_col1);

    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION,direction1);
    glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,50.0);
    glLightf(GL_LIGHT1,GL_SPOT_EXPONENT,2.0);


    glLightfv(GL_LIGHT2,GL_POSITION,light_pos2);
    glLightfv(GL_LIGHT2,GL_AMBIENT,amb_col2);
    glLightfv(GL_LIGHT2,GL_SPECULAR,light_col2);

    glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION,direction2);
    glLightf(GL_LIGHT2,GL_SPOT_CUTOFF,50.0);
    glLightf(GL_LIGHT2,GL_SPOT_EXPONENT,2.0);

    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1.0);


    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    //glEnable(GL_LIGHT1);
    glEnable(GL_LIGHT2);

    glEnable(GL_TEXTURE_2D);
}


void setTexture(void){
   
    FILE *fd;
    GLubyte ch;
    int i,j,k;
    fd=fopen("ok.ppm","r");
    for (i=0;i        for(j=0;j            for(k=0;k<4;k++){
            fread(&ch,1,1,fd);
            texImage[i][j][k]=ch;
            }
        }
    }
    fclose(fd);



}
point3 v[8]={
    {-1.0,-1.0,-1.0},
    {-1.0,-1.0,1.0},
    {-1.0,1.0,-1.0},
    {-1.0,1.0,1.0},
    {1.0,-1.0,-1.0},
    {1.0,-1.0,1.0},
    {1.0,1.0,-1.0},
    {1.0,1.0,1.0}

    };


point3 nomals[6]={
    {-1.0, 0.0,0.0},
    {0.0, 0.0, 1.0},
    {0.0, 1.0, 0.0},
    {0.0, 0.0, -1.0},
    { 0.0, -1.0,0.0},
    {1.0, 0.0, 0.0}
   
   
      };



void textureing(void){
   
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1,texName);
    glBindTexture(GL_TEXTURE_2D,texName[0]);
    glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);//LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);//LINEAR);
    glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA8,TEX_WIDTH,TEX_HEIGHT,0,GL_RGBA,GL_UNSIGNED_BYTE,texImage);




}
void cube(void){
    int face,edge;
   
    GLfloat shininess[]={10.0};
    GLfloat white[]={1.0,1.0,1.0,.50};
    GLfloat mat_specular[]={0.8,0.8,0.8,1.0};
    glMaterialfv(GL_FRONT,GL_AMBIENT,white );
    glMaterialfv(GL_FRONT,GL_DIFFUSE,white );
    glMaterialfv(GL_FRONT,GL_SHININESS, shininess);
    glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);

glBegin(GL_QUADS);
    glNormal3fv(nomals[0]);
    glVertex3fv(v[0]);
    glVertex3fv(v[1]);
    glVertex3fv(v[3]);
    glVertex3fv(v[2]);
glEnd();

glBegin(GL_QUADS);
    glNormal3fv(nomals[5]);
    glVertex3fv(v[4]);
    glVertex3fv(v[6]);
    glVertex3fv(v[7]);
    glVertex3fv(v[5]);
   
   
glEnd();
textureing();   
glBegin(GL_QUADS);
   
    glNormal3fv(nomals[1]);
    glTexCoord2f(0,0);    glVertex3fv(v[1]);
    glTexCoord2f(0,1);    glVertex3fv(v[3]);
    glTexCoord2f(1,1);    glVertex3fv(v[7]);
    glTexCoord2f(1,0);    glVertex3fv(v[5]);
   
glEnd();

glBegin(GL_QUADS);
    glNormal3fv(nomals[3]);

    glVertex3fv(v[0]);
    glVertex3fv(v[2]);
    glVertex3fv(v[6]);
    glVertex3fv(v[4]);
   
   
   
glEnd();
   
glBegin(GL_QUADS);
    glNormal3fv(nomals[2]);
   
    glTexCoord2f(0,0);    glVertex3fv(v[2]);
    glTexCoord2f(0,1);    glVertex3fv(v[3]);
    glTexCoord2f(1,1);    glVertex3fv(v[7]);
    glTexCoord2f(1,0);    glVertex3fv(v[6]);
   
   
   
glEnd();
   
    glDeleteTextures(1,texName);
glBegin(GL_QUADS);
   
    glNormal3fv(nomals[4]);

    glVertex3fv(v[1]);
    glVertex3fv(v[0]);
    glVertex3fv(v[4]);
    glVertex3fv(v[5]);
       
       
       
glEnd();
   
}

void display(void){
    #define SCALE 10,0
    int i,j;
    setTexture();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glViewport(0,0,(GLsizei)w/2,(GLsizei)h);   
   
        glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
   
    gluPerspective(60.0,((float)w/2)/(float)h,1.0,300.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
   
    gluLookAt(-vp, vp, vp, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0);
    glPushMatrix();
    glTranslatef(-10.0,10.0,10.0);
    glRotatef(angle,0., 0., 1.0);
    glScalef(5.0,5.0,5.0);
    glEnable(GL_NORMALIZE);
   
   
    cube();
   
    glPopMatrix();
   
   
   
    glutSwapBuffers();


   
}


void reshape(int width ,int high){
   
         w=width;h=high;
    glutPostRedisplay();
}




void iterationStep(void){
    if (angle>300)angle=0.0;
    angle+=0.5;
   
}

void animate(void){
    iterationStep();
    glutPostRedisplay();
}



int main(int argc,char** argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB| GLUT_DEPTH);
    glutInitWindowSize(500,500);
    glutInitWindowPosition(50,50);
    myWin= glutCreateWindow("Light Cube");
    myinit();
       


    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(animate);
    glutMainLoop();
}
 
阅读(366) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~