• <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)計(jì)

            留言簿(13)

            閱讀排行榜

            評論排行榜

            OpenGL學(xué)習(xí)筆記【10】——移動(dòng)光源,光照小結(jié)

            今天學(xué)習(xí)了移動(dòng)光源,奉上源代碼:
            #pragma comment(lib, "glaux.lib")
            #include 
            "gl\glaux.h"
            #include 
            <gl\glut.h>

            float yRot = 0;
            unsigned 
            int nPre = 0;
            GLfloat light_position[
            4= {0,0,0,1};        //光位置
            GLfloat light_diffuse[4= {1,0,1,1};        //光的漫反色
            GLfloat light_direction[4= {-1-2-11};    //光源聚光燈方向
            GLfloat light_change[3= {3,3,-1};            //光源移動(dòng)位置。

            void display(void)
            {
                glClear(GL_COLOR_BUFFER_BIT 
            | GL_DEPTH_BUFFER_BIT);    // 清楚顏色數(shù)據(jù)和深度數(shù)據(jù)(清屏)
                glColor3f(1.0,1.0,1.0);    
                glLoadIdentity();        
            //初始變換矩陣為單位矩陣

                glTranslated(
            0,-1,-5);    //平移0,0,-5向Z負(fù)方向平移5個(gè)單位

                glPushMatrix();        
            //壓縮矩陣,設(shè)定光源的位置
                glDisable(GL_LIGHTING);    
                glRotatef(yRot, 
            010);    //光源的旋轉(zhuǎn)
                glTranslatef(light_change[0],light_change[1],light_change[2]);    //光源的位置
                glTranslatef(light_position[0], light_position[1],light_position[2]);    //光源位置
                
                glutSolidSphere(
            0.14,4);//利用庫函數(shù)繪制一個(gè)半徑為1的球體。表示光源在這里
                glEnable(GL_LIGHTING);
                glLightfv(GL_LIGHT0, GL_POSITION, light_position);
                glPopMatrix();
                light_direction[
            0= -light_change[0];
                light_direction[
            1= -light_change[1];
                light_direction[
            2= -light_change[2];
                glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction);
                glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
                glPopMatrix();        
            //光源設(shè)置完畢

                glPushMatrix();            
            //要入矩陣,繪制地面
                glBegin(GL_QUADS);
                glVertex3f(
            -3,0,3);
                glVertex3f(
            3,0,3);
                glVertex3f(
            3,0,-3);
                glVertex3f(
            -3,0,-3);
                glEnd();
                glPopMatrix();            
            //地面繪制完畢

                glPushMatrix();            
            //壓入變換矩陣那
                glutSolidSphere(130,30);//利用庫函數(shù)繪制一個(gè)半徑為1的球體。
                glPopMatrix();            //彈出矩陣。

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


            //初始化
            void init (void
            {
                
            //srand(0);    隨機(jī)種子
                glClearColor (0.50.50.50.0);    //清理顏色,為黑色,(也可認(rèn)為是背景顏色)
                
                GLfloat light_param[] 
            = 1111.0 };    //初始化光參數(shù)。
                
            //glLightfv(GL_LIGHT0, GL_AMBIENT, light_param);    //設(shè)置光為環(huán)境光。
                
            //glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0); //設(shè)置聚光的范圍為45度。
                glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,2.0);    //設(shè)置聚光燈的聚光強(qiáng)度。
                
                glMaterialfv(GL_FRONT, GL_SPECULAR, light_param);    
            //設(shè)置材質(zhì)的漫反射屬性
                
            //glMaterialfv(GL_FRONT, GL_AMBIENT, light_param);    //設(shè)置材質(zhì)的環(huán)境屬性
                glMaterialf(GL_FRONT, GL_SHININESS, 64);    //設(shè)置材質(zhì)的高光屬性
                

                glEnable(GL_LIGHTING);        
            //啟動(dòng)光照
                glEnable(GL_LIGHT0);        //啟動(dòng)GL_LIGHTO光
                glCullFace(GL_BACK);        //剔除背面
                glEnable(GL_CULL_FACE);        //啟動(dòng)剔除
                glDepthFunc(GL_LEQUAL);        //深度檢測為小于等于
                glEnable(GL_DEPTH_TEST);    //啟動(dòng)深度檢測
                glFrontFace(GL_CCW);        //定義逆時(shí)針為正面

            }


            //當(dāng)窗口大小改變時(shí),會(huì)調(diào)用這個(gè)函數(shù)
            void reshape(GLsizei w,GLsizei h)
            {
                
            //這里小說明一下:矩陣模式是不同的,他們各自有一個(gè)矩陣。投影相關(guān)
                
            //只能用投影矩陣。(只是目前情況下哦,等我學(xué)多了可能就知道為什么了。)

                glViewport(
            0,0,w,h);        //設(shè)置視口
                glMatrixMode(GL_PROJECTION);    //設(shè)置矩陣模式為投影變換矩陣,
                glLoadIdentity();                //變?yōu)閱挝痪仃?/span>
                gluPerspective(60, (GLfloat)w / h, 01000);    //設(shè)置投影矩陣
                
            //glOrtho(-6.0, 6.0, -6.0 * h / w, 6.0* h / w, -10, 10);    //為了不變形,則要長和寬成比例
                glMatrixMode(GL_MODELVIEW);        //設(shè)置矩陣模式為視圖矩陣(模型)
                glLoadIdentity();                //變?yōu)閱挝痪仃?/span>
            }


            void Keyboard(unsigned char key, int x, int y)
            {
            }


            //閑置函數(shù),當(dāng)主循環(huán)空閑時(shí)就會(huì)調(diào)用這個(gè)函數(shù)
            void MyIdle(void)
            {
                unsigned 
            int nNow = ::GetTickCount();
                
            float delt = nNow - nPre;
                
            if (delt >  100)
                
            {
                    nPre 
            = nNow;
                    yRot 
            += 0.1 * delt;    //旋轉(zhuǎn)角度
                    /*light_diffuse[0] = (rand() % 255) / 255.0;//太花不用了。
                    light_diffuse[1] = (rand() % 255) / 255.0;
                    light_diffuse[2] = (rand() % 255) / 255.0;
            */

                    glutPostRedisplay();
                }

            }


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

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

            學(xué)習(xí)光源已經(jīng)好幾天,始終入不了門。不過這次學(xué)習(xí)移動(dòng)光源之后,有一點(diǎn)點(diǎn)感覺。函數(shù)的功能就不能介紹了。書上有,再次分享一下這本書,下載鏈接為:
            http://download.csdn.net/source/1247246
            主要心得:
            1.每個(gè)光源GL_LIGHT0--7都有相應(yīng)的環(huán)境光,點(diǎn)光源,聚光燈,漫射光等所有光的屬性,我們設(shè)置的屬性也只屬于這個(gè)光源。當(dāng)光源照射到物體上時(shí),OpenGL的函數(shù)會(huì)用這些所有的屬性與該物體做光照射的計(jì)算,實(shí)現(xiàn)光的效果。而沒有照射到得物體就不會(huì)計(jì)算。例如設(shè)置了環(huán)境光為[0.5,0.5,0.5,1.0],漫反射光為[1,0,1,1];如果照射到物體上,他會(huì)分別計(jì)算環(huán)境光的效果和漫射光的效果,然后再疊加他們的效果。疊加方式為取分量的最大值。若物體沒有被照射,則所有效果都不會(huì)被計(jì)算。也就是說會(huì)呈現(xiàn)黑色。我開始就沒有理解這些屬性關(guān)系,以為只要設(shè)置的環(huán)境光之后就能所有物體都能用了。其實(shí)不然,只有照射到得物體才會(huì)計(jì)算。如果想所有物體都有環(huán)境光,設(shè)置全局環(huán)境光才能達(dá)到這個(gè)效果。
            2.什么時(shí)候計(jì)算光照,在物體繪制的時(shí)候光照效果會(huì)計(jì)算。他會(huì)把光照設(shè)置光源的屬性通過矩陣變換到該物體坐標(biāo)系中,然后在進(jìn)行光照計(jì)算。也就是他會(huì)跟著物體變化。例如:設(shè)置了一個(gè)點(diǎn)光源在這個(gè)物體的前方。如果是通過矩陣變換來改變物體的位置。那么光源會(huì)一直在該物體的前方,因?yàn)樗且晕矬w坐標(biāo)系參照的。所以這里要注意,并不是說物體glTranslate(),glRotate()之后光照會(huì)發(fā)生變化。光的位置也會(huì)跟著變,使光照不變化。如果你想光源不隨著變化的話,在設(shè)置光源位置的時(shí)候,就要反著變一下。在設(shè)置光源的時(shí)候,也可以用平移旋轉(zhuǎn)的能矩陣運(yùn)算。
            3.兩個(gè)物體之間光照是否有影響:兩個(gè)物體光照不會(huì)有影響,也就是說不會(huì)出現(xiàn)一個(gè)物體遮住另一個(gè)物體的情況。因?yàn)樗窃谝粋€(gè)物體的物體坐標(biāo)系中計(jì)算效果的,而且只對該物體計(jì)算效果。所以不會(huì)對其他物體產(chǎn)生影響,如果要真實(shí),就得自己算出陰影在繪制。我還沒有學(xué)會(huì)。呵呵。如果不想物體產(chǎn)生光照,就用glDisable(GL_LIGHTIING);就可以了。在繪制其他物體再啟動(dòng)他。
            4.聚光燈:聚光燈我是沒有弄懂的,特別是他的方向,很暈很暈。感覺是向量,有感覺不像向量。到底怎么回事還得努力學(xué)習(xí),希望能碰到高手指點(diǎn)一下。
            5.其他方面:
            glFrontFace(GL_CW); 確定順時(shí)針為front面,默認(rèn)是GL_CCW既逆時(shí)針為正面。所以在繪制茶壺和球的時(shí)候會(huì)出問題,在繪制一個(gè)矩形的時(shí)候也要注意這個(gè)問題。

            posted on 2009-05-03 14:57 shongbee2 閱讀(7296) 評論(4)  編輯 收藏 引用 所屬分類: OpenGL

            評論

            # re: OpenGL學(xué)習(xí)筆記【10】——移動(dòng)光源,光照小結(jié) 2009-05-05 19:46 yanjun

            還是讀一下紅寶書好些
            會(huì)讓你忽然開朗  回復(fù)  更多評論   

            # re: OpenGL學(xué)習(xí)筆記【10】——移動(dòng)光源,光照小結(jié) 2009-05-05 19:54 yanjun

            .聚光燈
            首先點(diǎn)光源下才計(jì)算的,position[]={x,y,z,w>0};
            其次GL_SPOT_CUTOFF!=180,
            再次GL_SPOT_CUTOFF<90(聚光)
            90~180我把它說成用一個(gè)板擋著一個(gè)spot_point
            紅寶書上面講的很明白  回復(fù)  更多評論   

            # re: OpenGL學(xué)習(xí)筆記【10】——移動(dòng)光源,光照小結(jié) 2009-05-08 23:57 shongbee2

            @yanjun
            哦,謝謝推薦。呵呵,,我也是馬上打算看這本書。不過還沒有找到呵呵。
              回復(fù)  更多評論   

            # re: OpenGL學(xué)習(xí)筆記【10】——移動(dòng)光源,光照小結(jié) 2011-11-15 09:08 cghy2011

            不錯(cuò)  回復(fù)  更多評論   

            亚洲精品无码久久千人斩| 国产91久久精品一区二区| 91精品国产91久久| 国产精久久一区二区三区| 久久国产精品免费一区| 偷偷做久久久久网站| 久久国产精品一国产精品金尊| 996久久国产精品线观看| 狠狠久久综合伊人不卡| 激情久久久久久久久久| 国产精品久久久久久久久软件| 国产午夜福利精品久久2021| 久久精品视频91| 久久99毛片免费观看不卡 | 久久综合丝袜日本网| 久久精品国产只有精品66| 国产成人久久精品激情 | 久久综合九色综合精品| 久久精品国产亚洲av麻豆蜜芽| 99久久精品国产一区二区| 亚洲精品乱码久久久久久| 久久人人爽人人爽AV片| 精品久久久久久国产潘金莲 | 日韩AV无码久久一区二区| 日韩欧美亚洲综合久久影院Ds| 99久久免费国产特黄| 日韩人妻无码精品久久免费一| 久久综合九色综合久99| 大蕉久久伊人中文字幕| 99999久久久久久亚洲| 久久精品水蜜桃av综合天堂| 久久久久久久波多野结衣高潮| 久久久久国色AV免费看图片| 91精品国产91久久久久久青草| 久久久精品人妻一区二区三区四 | 99久久精品九九亚洲精品| 欧美黑人又粗又大久久久 | 久久免费视频网站| 亚洲成人精品久久| 91精品国产高清久久久久久91| 久久香蕉国产线看观看乱码|