• <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);        //反射光基本沒有效果。可能是我不知道吧

                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 閱讀(3695) 評論(1)  編輯 收藏 引用 所屬分類: OpenGL

            評論

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

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

            亚洲国产天堂久久综合| 久久这里都是精品| 无码AV中文字幕久久专区| 久久影院午夜理论片无码 | 一本色道久久99一综合| 日日狠狠久久偷偷色综合0| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 欧美黑人又粗又大久久久| 久久九九兔免费精品6| 国产色综合久久无码有码| 精品久久亚洲中文无码| 少妇久久久久久久久久| 久久久久无码精品国产不卡| 久久亚洲欧美国产精品 | 欧美熟妇另类久久久久久不卡| 精品国产乱码久久久久久人妻| 久久亚洲AV成人无码| 亚洲狠狠婷婷综合久久蜜芽| 久久精品国产亚洲av麻豆色欲| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久国产精品-久久精品| 久久精品中文字幕第23页| 伊人情人综合成人久久网小说| 久久久久人妻一区二区三区| 亚洲日韩中文无码久久| 夜夜亚洲天天久久| 伊人久久大香线蕉成人| 精品免费久久久久国产一区| 精品久久久久久| 精品久久久久久久中文字幕| 久久亚洲av无码精品浪潮| 国产精品99久久久精品无码| 久久人爽人人爽人人片AV| 99久久精品国产毛片| 国色天香久久久久久久小说| 99久久99久久| 久久九九兔免费精品6| 久久精品无码av| 99久久精品国内| 久久精品无码一区二区WWW| 国产无套内射久久久国产|