程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 真實感球繪制

真實感球繪制

編輯:C++入門知識

真實感球的繪制關鍵函數:   glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_shininess);//設置材料反射指數 glLightfv(GL_LIGHT0, GL_POSITION, light_position);//光源位置 glShadeModel ( GL_SMOOTH ); //設置陰影模型 glViewport (0, 0, (GLsizei) w, (GLsizei) h); 視點設計 glOrtho (x1,x2,y1,y2,z1,z2); //創建平行視景體   [cpp]   # include < GL/glut.h >    /* 初始化材料屬性、光源屬性、光照模型,打開深度緩沖區等 */    void init(void)    {        GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };        GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };       glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //設置背景色為藍色       glShadeModel ( GL_SMOOTH );        //glMaterialfv(GL_FRONT,GL_AMBIENT,mat_specular);        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);       glLightfv ( GL_LIGHT0, GL_POSITION, light_position);        glEnable (GL_LIGHTING);        glEnable (GL_LIGHT0);        glEnable (GL_DEPTH_TEST);    }    /*調用 GLUT 函數,繪制一個球*/    void display ( void )    {        glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        glutSolidSphere (1.0, 40, 50);    //半徑為 1,40 條緯線,50 條經線       glFlush ();    }    /* 定義 GLUT 的 reshape 函數,w、h 分別是輸出圖形的窗口的寬和高*/    void reshape (int w, int h)    {        glViewport (0, 0, (GLsizei) w, (GLsizei) h);        glMatrixMode (GL_PROJECTION);        glLoadIdentity ( );        if (w <= h)            glOrtho (-1.5, 1.5, -1.5 * ( GLfloat ) h / ( GLfloat ) w,            1.5* ( GLfloat ) h / ( GLfloat ) w, -10.0, 10.0 ); //創建平行視景體       else            glOrtho (-1.5 * ( GLfloat ) w / ( GLfloat ) h,1.5 * ( GLfloat )            w/( GLfloat ) h, -1.5, 1.5, -10.0, 10.0);        glMatrixMode ( GL_MODELVIEW );        glLoadIdentity ( ) ;    }    int main(int argc, char** argv)    {        glutInit (&argc, argv);     // GLUT 環境初始化       glutInitDisplayMode (GLUT_SINGLE |GLUT_RGB |GLUT_DEPTH); // 顯示模式初始化       glutInitWindowSize (300, 300);       // 定義窗口大小       glutInitWindowPosition (100, 100);   // 定義窗口位置         glutCreateWindow ( argv [ 0 ] );   // 顯示窗口,窗口標題為執行函數名       init( );       glutDisplayFunc ( display );    // 注冊 OpenGL 繪圖函數(一種特殊的調用方式,下同)        glutReshapeFunc ( reshape );   // 注冊窗口大小改變時的響應函數       glutMainLoop( );      // 進入 GLUT 消息循環,開始執行程序       return 0;    }      效果圖:   將init( )中的 [cpp]   GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };        GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };       glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //設置背景色為藍色       glShadeModel ( GL_SMOOTH );        //glMaterialfv(GL_FRONT,GL_AMBIENT,mat_specular);        glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);       改為 [cpp]   GLfloat light_position [ ] = { 1.0, 1.0, 1.0, 0.0 };        GLfloat mat_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };       GLfloat mat_shininess[] = { 50.0 };       glClearColor ( 0.0, 0.0, 1.0, 0.0 ); //設置背景色為藍色       glShadeModel ( GL_SMOOTH );        //glMaterialfv(GL_FRONT,GL_AMBIENT,mat_specular);        glMaterialfv(GL_FRONT, GL_SPECULAR, mat_diffuse);        glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);//設置材料反射指數     即將漫射光GL_DIFFUSE改為鏡面光GL_SPECULAR,可得效果   相應的還有環境光GL_AMBIENT,讀者可執行嘗試。 -----------------------------------------------------------       上面的代碼是用glut,即openGL utilizing tool做的,還有一種做法是用OpenGL的AUX,要下載glaux.lib和glaux.h, 代碼如下: [cpp]   #include<GL/glut.h>   #include <gl/GLAUX.H>   #pragma comment(lib, "glaux")      void myinit(void)   {       GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };       GLfloat mat_shininess[] = { 50.0 };       GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };          glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);//set material 鏡面光反射       glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);//設置材料反射指數       glLightfv(GL_LIGHT0, GL_POSITION, light_position);//光源位置          glEnable(GL_LIGHTING);       glEnable(GL_LIGHT0);       glDepthFunc(GL_LEQUAL);       glEnable(GL_DEPTH_TEST);   }      void display(void)   {       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);       auxSolidSphere(1.0);       glFlush();   }      void myReshape(GLsizei w, GLsizei h)   {       glViewport(0, 0, w, h);       glMatrixMode(GL_PROJECTION);       glLoadIdentity();       if (w <= h)            glOrtho (-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,            1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);       else            glOrtho (-1.5*(GLfloat)w/(GLfloat)h,            1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);       glMatrixMode(GL_MODELVIEW);       glLoadIdentity();   }         int main(int argc, char** argv)   {       auxInitDisplayMode (AUX_SINGLE | AUX_RGBA | AUX_DEPTH);       auxInitPosition (0, 0, 500, 500);       auxInitWindow ((LPCWSTR)"Lighting Sphere");       myinit();       auxReshapeFunc ((AUXRESHAPEPROC)myReshape);       auxMainLoop((AUXMAINPROC)display);   }     效果如下:   最後還看到一組超全的光亮度模型結果,代碼在這裡。 結果如圖:      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved