#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) |