• <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>

            隨感而發(fā)

            雜七雜八

            統(tǒng)計

            留言簿(13)

            閱讀排行榜

            評論排行榜

            OpenGL學習筆記【8】——顏色材質(zhì)

            今天學習了顏色材質(zhì):奉上源代碼:

            #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);    // 清楚顏色數(shù)據(jù)和深度數(shù)據(jù)(清屏)
                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();            
            //壓入變換矩陣那

                
            //材質(zhì)設置有效一直保持到改變?yōu)橹埂?/span>
                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);    
            //最開始顏色材質(zhì)對應的是ambient的。所以要給為diffuse
                glColor4f(0,0,0,1);        
                glEnable(GL_COLOR_MATERIAL);        
            //啟動顏色材質(zhì)


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

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

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

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

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

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

                glPopMatrix();

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


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


                GLfloat light_diffuse[]
            = 1.01.01.01.0};//藍色        //有燈光才能體現(xiàn)材質(zhì)的效果,他的燈光的強度是與的關系。貌似是兩個相乘什么的。(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);        
            //,漫射光會產(chǎn)生漫射的效果和高光的效果
                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);
            }


            //當窗口大小改變時,會調(diào)用這個函數(shù)
            void reshape(GLsizei w,GLsizei h)
            {
                glViewport(
            0,0,w,h);        //設置視口
                glMatrixMode(GL_PROJECTION);    //設置矩陣模式為投影變換矩陣,
                glLoadIdentity();                //變?yōu)閱挝痪仃?br>    //gluPerspective(60, (GLfloat)w / h, 0, 1000);    //設置投影矩陣
                glOrtho(-6.06.0-6.0 * h / w, 6.0* h / w, -1010);    //為了不變形,則要長和寬成比例
                glMatrixMode(GL_MODELVIEW);        //設置矩陣模式為視圖矩陣(模型)
                glLoadIdentity();                //變?yōu)閱挝痪仃?/span>
            }


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

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

             

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

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

            評論

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

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

            久久狠狠爱亚洲综合影院| 亚洲国产精品高清久久久| 色综合色天天久久婷婷基地| 66精品综合久久久久久久| 91精品国产综合久久香蕉 | 久久精品国产亚洲AV无码偷窥| 久久精品国产久精国产思思| 色综合久久最新中文字幕| 久久久久久久久久久| 久久99精品国产99久久6| 日产精品久久久久久久| 久久久久亚洲AV成人网| 久久99国产乱子伦精品免费| 一级女性全黄久久生活片免费| 久久精品国产精品亚洲毛片| 亚洲国产成人精品久久久国产成人一区二区三区综 | 综合网日日天干夜夜久久| 久久青草国产手机看片福利盒子| 国产aⅴ激情无码久久| 久久精品国产国产精品四凭 | 亚洲国产天堂久久综合网站 | 久久久九九有精品国产| 亚洲色婷婷综合久久| 亚洲欧洲精品成人久久曰影片| 国产精品久久久久9999高清| 热re99久久6国产精品免费| 2021国内精品久久久久久影院| 狠狠久久综合伊人不卡| 国产精品久久久99| 久久精品国产精品亚洲精品 | 少妇久久久久久久久久| 久久久久久久久66精品片| 久久久久亚洲精品中文字幕| 欧美综合天天夜夜久久| 久久亚洲国产中v天仙www| 亚洲精品高清久久| 国产成人综合久久精品尤物| 久久精品亚洲男人的天堂| 青春久久| 久久精品麻豆日日躁夜夜躁| 伊人久久大香线蕉综合Av|