• <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  回復  更多評論   

            久久综合狠狠综合久久| 久久亚洲春色中文字幕久久久| 久久综合亚洲色一区二区三区| 奇米影视7777久久精品人人爽| 色婷婷噜噜久久国产精品12p | 狠狠综合久久综合88亚洲| 欧美午夜精品久久久久免费视| 丰满少妇人妻久久久久久| 青春久久| 国产精品久久久久久吹潮| 久久精品亚洲福利| 日韩AV无码久久一区二区| 久久久久亚洲AV成人网人人网站| 日韩精品久久无码人妻中文字幕| 久久亚洲精品中文字幕三区| 久久精品无码专区免费东京热| 国产成人精品三上悠亚久久| 国产精品日韩欧美久久综合| 久久精品无码一区二区三区| 久久人妻少妇嫩草AV无码专区| 色综合久久久久综合99| 69久久精品无码一区二区| 久久99免费视频| 久久w5ww成w人免费| 亚洲AV无码久久精品狠狠爱浪潮 | 日产精品久久久久久久| 久久精品亚洲男人的天堂| 99久久免费国产精精品| 天天躁日日躁狠狠久久| 亚洲AⅤ优女AV综合久久久| 99久久精品国产一区二区蜜芽| MM131亚洲国产美女久久| 综合人妻久久一区二区精品| 色婷婷噜噜久久国产精品12p| 久久电影网| 香蕉久久夜色精品国产2020| 中文字幕精品无码久久久久久3D日动漫| 亚州日韩精品专区久久久| 久久久久噜噜噜亚洲熟女综合| 99久久综合国产精品二区| 99久久亚洲综合精品网站|