⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cube.c

📁 GNU/Linux程序开发指南书的所有例子源代码
💻 C
字号:
#include <stdio.h>#include <GL/glut.h>int Texture_ID;int Window_Width = 300;int Window_Height = 300;float X_Rot   = 0.9f;float Y_Rot   = 0.0f;float X_Speed = 0.0f;float Y_Speed = 0.5f;float Z_Off   =-5.0f;void cbRenderScene(void){  glEnable(GL_TEXTURE_2D);  glEnable(GL_LIGHTING);  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);  glEnable(GL_DEPTH_TEST);   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,                  GL_NEAREST_MIPMAP_NEAREST);  glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity();   glTranslatef(0.0f,0.0f,Z_Off);  glRotatef(X_Rot,1.0f,0.0f,0.0f);  glRotatef(Y_Rot,0.0f,1.0f,0.0f);  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);  glBegin(GL_QUADS);   glNormal3f( 0.0f, -1.0f, 0.0f); glColor4f(0.9,0.2,0.2,.75);  glTexCoord2f(0.800f, 0.800f); glVertex3f(-1.0f, -1.0f, -1.0f);   glTexCoord2f(0.200f, 0.800f); glVertex3f( 1.0f, -1.0f, -1.0f);  glTexCoord2f(0.200f, 0.200f); glVertex3f( 1.0f, -1.0f,  1.0f);  glTexCoord2f(0.800f, 0.200f); glVertex3f(-1.0f, -1.0f,  1.0f);   glNormal3f( 0.0f, 1.0f, 0.0f); glColor4f(0.5,0.5,0.5,.5);  glTexCoord2f(0.005f, 1.995f); glVertex3f(-1.0f,  1.3f, -1.0f);  glTexCoord2f(0.005f, 0.005f); glVertex3f(-1.0f,  1.3f,  1.0f);  glTexCoord2f(1.995f, 0.005f); glVertex3f( 1.0f,  1.3f,  1.0f);  glTexCoord2f(1.995f, 1.995f); glVertex3f( 1.0f,  1.3f, -1.0f);  glNormal3f( 0.0f, 0.0f,-1.0f); glColor4f(0.2,0.9,0.2,.5);   glTexCoord2f(0.995f, 0.005f); glVertex3f(-1.0f, -1.0f, -1.3f);  glTexCoord2f(2.995f, 2.995f); glVertex3f(-1.0f,  1.0f, -1.3f);  glTexCoord2f(0.005f, 0.995f); glVertex3f( 1.0f,  1.0f, -1.3f);  glTexCoord2f(0.005f, 0.005f); glVertex3f( 1.0f, -1.0f, -1.3f);     glNormal3f( 1.0f, 0.0f, 0.0f); glColor4f(0.2,0.2,0.9,.25);  glTexCoord2f(0.995f, 0.005f); glVertex3f( 1.0f, -1.0f, -1.0f);   glTexCoord2f(0.995f, 0.995f); glVertex3f( 1.0f,  1.0f, -1.0f);  glTexCoord2f(0.005f, 0.995f); glVertex3f( 1.0f,  1.0f,  1.0f);  glTexCoord2f(0.005f, 0.005f); glVertex3f( 1.0f, -1.0f,  1.0f);  glNormal3f( 0.0f, 0.0f, 1.0f);   glColor4f(0.9f, 0.2f, 0.2f, 0.5f);glTexCoord2f( 0.005f, 0.005f);glVertex3f(-1.0f, -1.0f,  1.3f);  glColor4f(0.2f, 0.9f, 0.2f, 0.5f);glTexCoord2f( 0.995f, 0.005f);glVertex3f( 1.0f, -1.0f,  1.3f);  glColor4f(0.2f, 0.2f, 0.9f, 0.5f);glTexCoord2f( 0.995f, 0.995f);glVertex3f( 1.0f,  1.0f,  1.3f);   glColor4f(0.1f, 0.1f, 0.1f, 0.5f);glTexCoord2f( 0.005f, 0.995f);glVertex3f(-1.0f,  1.0f,  1.3f);  glNormal3f(-1.0f, 0.0f, 0.0f); glColor4f(0.9,0.9,0.2,0.0);  glTexCoord2f(0.005f, 0.005f); glVertex3f(-1.3f, -1.0f, -1.0f);   glTexCoord2f(0.995f, 0.005f); glVertex3f(-1.3f, -1.0f,  1.0f);  glTexCoord2f(0.995f, 0.995f); glVertex3f(-1.3f,  1.0f,  1.0f);  glTexCoord2f(0.005f, 0.995f); glVertex3f(-1.3f,  1.0f, -1.0f);  glEnd();  glutSwapBuffers();  X_Rot+=X_Speed;   Y_Rot+=Y_Speed; }void cbKeyPressed(unsigned char key, int x, int y){  if(key == 27)    exit;}void cbSpecialKeyPressed(int key, int x, int y){   switch (key) {   case GLUT_KEY_PAGE_UP:      Z_Off -= 0.05f;   break;   case GLUT_KEY_PAGE_DOWN:      Z_Off += 0.05f;   break;   case GLUT_KEY_UP:      X_Speed -= 0.01f; break;   case GLUT_KEY_DOWN:      X_Speed += 0.01f; break;   case GLUT_KEY_LEFT:      Y_Speed -= 0.01f; break;   case GLUT_KEY_RIGHT:      Y_Speed += 0.01f; break;    }}void ourBuildTextures(void){   GLenum gluerr;   GLubyte tex[128][128][4];   int x,y,t;   int hole_size = 3300; // ~ == 57.45 ^ 2.   glGenTextures(1,&Texture_ID);   glBindTexture(GL_TEXTURE_2D,Texture_ID);   for(y=0;y<128;y++) {      for(x=0;x<128;x++) {	if ( ( (x+4)%32 < 8 ) && ( (y+4)%32 < 8)) {	  tex[x][y][0]=tex[x][y][1]=0; tex[x][y][2]=120;	}	else tex[x][y][0]=tex[x][y][1]=tex[x][y][2]=240;	t = (x-64)*(x-64) + (y-64)*(y-64) ;	if ( t < hole_size)	     tex[x][y][3]=255;	else if (t < hole_size + 100)	     tex[x][y][3]=128;	else tex[x][y][3]=0;      }   }   if ((gluerr=gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 128, 128, GL_RGBA,                 GL_UNSIGNED_BYTE, (void *)tex))) {      fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr));      exit(-1);   }   glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);   glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);}void cbResizeScene(int Width, int Height){   if (Height == 0) Height = 1;   glViewport(0, 0, Width, Height);   glMatrixMode(GL_PROJECTION);   glLoadIdentity();   gluPerspective(45.0f,(GLfloat)Width/(GLfloat)Height,0.1f,100.0f);   glMatrixMode(GL_MODELVIEW);   Window_Width  = Width;   Window_Height = Height;}void ourInit(int Width, int Height) {   ourBuildTextures();      glClearColor(0.1f, 0.1f, 0.1f, 0.0f);   glClearDepth(1.0);   glDepthFunc(GL_LESS);    glShadeModel(GL_SMOOTH);   cbResizeScene(Width,Height);   glLightfv(GL_LIGHT1, GL_POSITION, (float []){ 2.0f, 2.0f, 0.0f, 1.0f });   glLightfv(GL_LIGHT1, GL_AMBIENT,  (float []){ 0.1f, 0.1f, 0.1f, 1.0f });   glLightfv(GL_LIGHT1, GL_DIFFUSE,  (float []) { 1.2f, 1.2f, 1.2f, 1.0f });    glEnable (GL_LIGHT1);    glColorMaterial(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE);   glEnable(GL_COLOR_MATERIAL);}int main(int argc, char *argv[]){   glutInit(&argc, argv);   glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);   glutInitWindowSize(Window_Width, Window_Height);   glutCreateWindow(argv[0]);   glutDisplayFunc(&cbRenderScene);   glutIdleFunc(&cbRenderScene);   glutReshapeFunc(&cbResizeScene);   glutKeyboardFunc(&cbKeyPressed);   glutSpecialFunc(&cbSpecialKeyPressed);   ourInit(Window_Width, Window_Height);   glutMainLoop();   return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -