• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            隨感而發

            雜七雜八

            統計

            留言簿(13)

            閱讀排行榜

            評論排行榜

            OpenGL學習筆記【8】——顏色材質

            今天學習了顏色材質:奉上源代碼:

            #pragma comment(lib, "glaux.lib")
            #include 
            "gl\glaux.h"
            #include 
            <gl\glut.h>
            float yRot = 0;
            unsigned 
            int nPre = 0;
            void display(void)
            {
                glClear(GL_COLOR_BUFFER_BIT 
            | GL_DEPTH_BUFFER_BIT);    // 清楚顏色數據和深度數據(清屏)
                glColor3f(1.0,1.0,1.0);
                glLoadIdentity();        
            //初始變換矩陣為單位矩陣

                GLfloat no_mat[] 
            = {0.00.00.01.0};
                GLfloat mat_ambient[] 
            = {1.01.01.01.0};
                GLfloat mat_diffuse[] 
            = {1.00.00.01.0};
                GLfloat mat_specular[] 
            =  {1.01.01.01.0};
                GLfloat no_shininess[] 
            = {0.0};
                GLfloat low_shininess[] 
            = {5.0};
                GLfloat hig_shininess[] 
            = {100.0};
                GLfloat mat_emission[] 
            = {0.3,0.80.01.0};



                glPushMatrix();            
            //壓入變換矩陣那

                
            //材質設置有效一直保持到改變為止。
                glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
                glMaterialfv(GL_FRONT, GL_SHININESS, hig_shininess);
                glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat);
                glColorMaterial(GL_FRONT,GL_DIFFUSE);    
            //最開始顏色材質對應的是ambient的。所以要給為diffuse
                glColor4f(0,0,0,1);        
                glEnable(GL_COLOR_MATERIAL);        
            //啟動顏色材質


                glPushMatrix();
                glTranslatef(
            -3.753.00.0);    //第一個球的位置    
                glColorMaterial(GL_FRONT, GL_SHININESS);    //這個事無效的
                glColor4f(0.00.01.01.0);        //顏色材質為藍色
                glutSolidSphere(130,30);//利用庫函數繪制一個半徑為1的球體。
                glPopMatrix();            //彈出矩陣。

                glPushMatrix();
                glTranslatef(
            -1.253.00.0);
                glColor4f(
            1.00.01.01.0);    //顏色材質為紫色

                glutSolidSphere(
            130,30);//利用庫函數繪制一個半徑為1的球體。
                glPopMatrix();

                glPushMatrix();        
                glTranslatef(
            1.253.00.0);
                glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);    
            //用設置矩陣堆棧的方式來用材質,發現他以顏色材質為準。
                glutSolidSphere(130,30);//利用庫函數繪制一個半徑為1的球體。
                glPopMatrix();

                
            //第一行第三列繪制的球有漫反射光和鏡面光,并有很亮的高光,而無環境光 
                glPushMatrix();
                glTranslatef(
            1.250.00.0);
                glDisable(GL_COLOR_MATERIAL);        
            //禁用顏色材質之后,就可以用堆棧方式了。
                glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
                glutSolidSphere(
            130,30);//利用庫函數繪制一個半徑為1的球體。
                glPopMatrix();

                glPushMatrix();        
            //這里會沿用以前的設置的材質。
                glTranslatef(3.750.00.0);
                glutSolidSphere(
            130,30);//利用庫函數繪制一個半徑為1的球體。
                glPopMatrix();

                glPopMatrix();

                glutSwapBuffers();            
            //交換緩沖區。顯示圖形
            }


            //初始化
            void init (void
            {
                glClearColor (
            0.50.50.50.0);    //清理顏色,為黑色,(也可認為是背景顏色)


                GLfloat light_diffuse[]
            = 1.01.01.01.0};//藍色        //有燈光才能體現材質的效果,他的燈光的強度是與的關系。貌似是兩個相乘什么的。(0-1)范圍。
                GLfloat light_position[] = 032.00.0 };        //設置點光源的矩陣,這個向量也忒奇怪了,1不跟著變,0跟著變,設置為透視之后又是1跟著變,0不跟著變。
                GLfloat light_specular[] = 1.01.01.01.0 };        //反射光
                GLfloat light_ambient[] = {0.50.50.51.0};

                glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
                glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);        
            //,漫射光會產生漫射的效果和高光的效果
                glLightfv(GL_LIGHT0, GL_POSITION, light_position);    //點光源沒有漫射光的效果,會一直是黑色的。但會有高光反射的效果。
                glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);        //反射光基本沒有效果??赡苁俏也恢腊?/span>

                glEnable(GL_LIGHTING);
                glEnable(GL_LIGHT0);    
            //如果什么都不設置,GL_LIGHT有默認的值。
                glCullFace(GL_BACK);
                glEnable(GL_CULL_FACE);
                glDepthFunc(GL_LEQUAL);    
                glEnable(GL_DEPTH_TEST);
            }


            //當窗口大小改變時,會調用這個函數
            void reshape(GLsizei w,GLsizei h)
            {
                glViewport(
            0,0,w,h);        //設置視口
                glMatrixMode(GL_PROJECTION);    //設置矩陣模式為投影變換矩陣,
                glLoadIdentity();                //變為單位矩陣
                
            //gluPerspective(60, (GLfloat)w / h, 0, 1000);    //設置投影矩陣
                glOrtho(-6.06.0-6.0 * h / w, 6.0* h / w, -1010);    //為了不變形,則要長和寬成比例
                glMatrixMode(GL_MODELVIEW);        //設置矩陣模式為視圖矩陣(模型)
                glLoadIdentity();                //變為單位矩陣
            }


            int main(int argc, char** argv)
            {
                glutInit(
            &argc, argv);        //Opnegl初始化
                glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); //設置顯示模式為雙緩沖,RGEBA

                glutInitWindowSize (
            800600);            //窗口大小
                glutInitWindowPosition (100100);        //窗口位置
                glutCreateWindow ("hello");                //創建一個標題為hello的窗口
                init ();                                //初始化資源,這里一定要在創建窗口以后,不然會無效。
                glutDisplayFunc(display);                //窗口大小改變時的回調
                glutReshapeFunc(reshape);                //繪制圖形時的回調
                glutMainLoop();                            //主循環。
                return 0;  
            }

             

            他和矩陣堆棧的材質不同,他是通過設置改變材質的什么屬性,然后通過顏色來設置材質的,書上說他的效率要高一點。
            相關函數;
            glEnable(GL_COLOR_MATERIAL);  //啟動顏色材質, 允許使用顏色材質。啟動之后我們才能通過顏色來設置材質。
            glDisable(GL_COLOR_MATERIAL);  //禁用顏色材質,禁用之后就不用顏色材質了。這樣可以減小開銷。
            glColorMaterial(GL_FRONT,GL_DIFFUSE); 設置顏色改變哪個材質屬性,和設置材質是差不多的,只是少了一個參數。第一個是材質面,第二個是材質類型枚舉:環境光,漫反射等材質類型。
            設置了之后我們通過
            glColor4f(0,0,0,1); 來更改對應材質類型的材質了。
            學習心得:
            3.1使用顏色材質的優先級要比使用矩陣的高,也就是說使用了顏色材質設置之后,你的矩陣材質就會失效。
            如果你沒有設置對應的顏色材質,他才會去看是矩陣材質。所以一定程度上矩陣材質和顏色材質可以共存。他也會保存上一次的材質信息。及時你disable之后再enable,也會保存。所以要注意。
            3.2開始使用glEnable(GL_COLOR_MATERIAL)的時候,改變顏色改變的是ambient材質。但是你定位改變材質類型之后,無論你多少次的disable和enable都是改變上次定位的材質屬性。
            3.3 glColorMaterial.設置顏色材質類型只能使有顏色的類型,例如漫反射,輻射,環境光,反射等,對于高光這種不是顏色中設置不可以的。

            posted on 2009-05-01 23:48 shongbee2 閱讀(3678) 評論(1)  編輯 收藏 引用 所屬分類: OpenGL

            評論

            # re: OpenGL學習筆記【8】——顏色材質 2009-12-16 15:51 allen

            博主,可否加我msn,有些問題請教一下。
            allen_huang128@hotmail.com  回復  更多評論   

            亚洲精品视频久久久| 久久一区二区三区99| 麻豆AV一区二区三区久久| 久久综合给合久久狠狠狠97色69| 国内精品久久久久久久97牛牛| 国产精品久久久久无码av| 国内精品久久久久久久影视麻豆| 欧美精品乱码99久久蜜桃| 久久青青草原精品国产| 久久99精品免费一区二区| 国内精品综合久久久40p| 久久亚洲国产午夜精品理论片| 久久伊人五月天论坛| 国产一级做a爰片久久毛片| 欧洲国产伦久久久久久久| 97久久久久人妻精品专区| 免费精品国产日韩热久久| 国产午夜福利精品久久2021| 久久综合鬼色88久久精品综合自在自线噜噜 | 色综合久久最新中文字幕| 久久无码高潮喷水| 久久久99精品成人片中文字幕| 99久久99久久精品国产片果冻| 久久国产香蕉视频| 久久香蕉综合色一综合色88| 精品久久久久久亚洲精品| 伊人久久综合无码成人网| 亚洲国产香蕉人人爽成AV片久久| 99久久国产亚洲高清观看2024| 久久久无码人妻精品无码| 久久精品国产亚洲AV久| 色综合久久中文字幕综合网| 久久久久国产一级毛片高清板| 青青草原综合久久| AAA级久久久精品无码区| 精品国产一区二区三区久久| 亚洲精品白浆高清久久久久久| 国产aⅴ激情无码久久| 五月丁香综合激情六月久久| 国产A三级久久精品| 久久99国产综合精品女同|