Ubuntu下OpenGL編程基礎解析

   本文重點介紹在ubuntu下怎麼進行OpenGL基礎編程,其主要步驟如下:

1:首先當然需要安裝一些基本的編譯庫和OpenGL庫文件,主要安裝以下兩個就ok了

    基本編譯庫:build-essential 

    sudo apt-get install  build-essential

    OpenGL工具庫:freeglut3-dev

    sudo apt-get install freeglut3-dev

      以上是本人在虛擬機上安裝的提示,可以看到除了freeglut3外 還安裝了其他額外的軟件包。

 2:第二步,當然是編寫代碼了,這個就不用講了,自己貼一個,有時間可以研究下。

/* Rotating cube with color interpolation */ 

#include <stdlib.h>
#include <GL/glut.h>

 GLfloat vertices[][3] = {{-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}}; 

 GLfloat normals[][3] = {{-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}};

 GLfloat colors[][3] = {{0.0,0.0,0.0},{1.0,0.0,0.0},
   {1.0,1.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}, 
   {1.0,0.0,1.0}, {1.0,1.0,1.0}, {0.0,1.0,1.0}};


void polygon(int a, int b, int c , int d)
{
  glBegin(GL_POLYGON); 
  glColor3fv(colors[a]);  
  glNormal3fv(normals[a]);  
  glVertex3fv(vertices[a]); 
  glColor3fv(colors[b]); 
  glNormal3fv(normals[b]);  
  glVertex3fv(vertices[b]); 
  glColor3fv(colors[c]); 
  glNormal3fv(normals[c]); 
  glVertex3fv(vertices[c]); 
  glColor3fv(colors[d]); 
  glNormal3fv(normals[d]); 
  glVertex3fv(vertices[d]); 
  glEnd(); 
}

 

void colorcube(void) 

/* map vertices to faces */ 
 
   polygon(0,3,2,1); 
   polygon(2,3,7,6); 
   polygon(0,4,7,3); 
   polygon(1,2,6,5); 
   polygon(4,5,6,7); 
   polygon(0,1,5,4); 
}

static GLfloat theta[] = {0.0,0.0,0.0}; 
static GLint axis = 2; 

void display(void) 

/* display callback, clear frame buffer and z buffer,
  rotate cube and draw, swap buffers */ 
 
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
 glLoadIdentity(); 
 glRotatef(theta[0], 1.0, 0.0, 0.0); 
 glRotatef(theta[1], 0.0, 1.0, 0.0); 
 glRotatef(theta[2], 0.0, 0.0, 1.0); 
 colorcube(); 
 glFlush(); 
 glutSwapBuffers(); 

 


void spinCube()
{
 /* Idle callback, spin cube 2 degrees about selected axis */
 theta[axis] += 2.0; 
 if( theta[axis] > 360.0 ) theta[axis] -= 360.0;
 display();
}

 

void mouse(int btn, int state, int x, int y)
{
 /* mouse callback, selects an axis about which to rotate */
  if(btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) axis = 0; 
  if(btn==GLUT_MIDDLE_BUTTON && state == GLUT_DOWN) axis = 1; 
  if(btn==GLUT_RIGHT_BUTTON && state == GLUT_DOWN) axis = 2;
}

void myReshape(int w, int h)
{
 glViewport(0, 0, w, h); 
 glMatrixMode(GL_PROJECTION); 
 glLoadIdentity(); 
 if (w <= h) 
 {
  glOrtho(-2.0, 2.0, -2.0 * (GLfloat) h / (GLfloat) w, 
           2.0 * (GLfloat) h / (GLfloat) w, -10.0, 10.0); 
 }
   else
   {
       glOrtho(-2.0 * (GLfloat) w / (GLfloat) h, 
           2.0 * (GLfloat) w / (GLfloat) h, -2.0, 2.0, -10.0, 10.0);
   }

   glMatrixMode(GL_MODELVIEW);
}


main(int argc, char **argv)
{
 glutInit(&argc, argv);
 /* need both double buffering and z buffer */

 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(500, 500); 
    glutCreateWindow("colorcube"); 
    glutReshapeFunc(myReshape); 
    glutDisplayFunc(display); 
 glutIdleFunc(spinCube); 
 glutMouseFunc(mouse); 
 glEnable(GL_DEPTH_TEST); /* Enable hidden--surface--removal */  
    glutMainLoop();

return 0;

}

 

3:下面直接在console進行編譯:

在編譯過程中,-lglut和-lGLU 如果不加的話,會報上述undefined reference to “xxx”錯誤。

 

4:運行結果

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章