第七講 顯示例表

ingenuus發表於2007-11-12
利用顯示列表,我們們可以減少重複的勞動。我們可以從例5中得到體會。

  例5:繪製六個彩色的三角形,如圖六。

#include <windows.h>
#include <GL/glut.h>
GLuint listName = 1;

void myInit(void)
{
 glClearColor(0.0,0.0,0.0,0.0);//設定背景為黑色

 glNewList(listName,GL_COMPILE);//建立顯示列表
 /*畫一個彩色的多邊形*/
 glBegin(GL_POLYGON);
 glColor3f(1.0,0.0,0.0);
 glVertex2f(1.0,1.0);

 glColor3f(0.0,1.0,0.0);
 glVertex2f(2.0,2.0);

 glColor3f(0.0,0.0,1.0);
 glVertex2f(1.5,2.5);

 glTranslatef(0.5,-0.5,0.0);//座標轉換
 glEnd();
 glEndList();//結束顯示列表

 glShadeModel(GL_SMOOTH);
}


void myDisplay(void)
{
 GLuint i;
 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

 for(i = 0;i<6;i++)
  glCallList(listName);
 glFlush();
}

void myReshape(GLsizei w,GLsizei h)
{
 glViewport(0,0,w,h);
 glMatrixMode(GL_PROJECTION);
 glLoadIdentity();
 if(w<=h)
  glOrtho(-4.0,4.0,-4.0*(GLfloat)h/(GLfloat)w,4.0*(GLfloat)h/(GLfloat)w,-8.0,8.0);
 else
  glOrtho(-4.0,4.0*(GLfloat)w/(GLfloat)h,-4.0,4.0,-8.0,8.0);
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glTranslatef(-4.0,0.0,-3.0);
}

int main(int argc,char ** argv)
{
 /*初始化*/
 glutInit(&argc,argv);

 glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);
 glutInitWindowSize(500,500);
 glutInitWindowPosition(100,200);

 /*建立視窗*/
 glutCreateWindow("display list");

 /*繪製與顯示*/
 myInit();
 glutReshapeFunc(myReshape);

 glutDisplayFunc(myDisplay);

 /*進入GLUT事件處理迴圈*/
 glutMainLoop();

 return(0);
}

   ·void glNewList(GLuint list,GLenum mode)和glEndList(void)建立或替換一個顯示列表。list為列表名稱。mode指定編譯模式,本例為GL_COMPILE。 GL_COMPILE表示僅僅編譯。GL_COMPILE_AND_EXECUTE表示當命令被編譯到顯示列表時執行。顯示列表時一個預先儲存起來已被將 來執行的一組OpenGL命令,使用glNewList函式建立顯示列表,並將所有需要執行的命令按照命令發出的順序放置在顯示列表中,直到呼叫 glEndList函式時結束顯示列表。本例中所需要執行的命令為畫一個多邊形。

  ·void glCallList(GLuint list)執行一個顯示列表。引數list為所要執行的顯示列表的名字,型別為整形。本例中在不同的位置繪製了六個完全一樣的三角形。
 
點選放大此圖片
圖六:六個彩色的三角形
 

相關文章