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

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

            opengl es 燈光

            這一章將在你的程序中加入燈光,使場景看起來和真實場景一樣。

            燈光

            opengl中燈光分為好幾種,都可以加入到你的場景中。

            Ambiend Light 環(huán)境光
            環(huán)境光沒有確切的來源方向,當(dāng)環(huán)境光照射到物體時,光被反射到各個方向。

            Diffuse Light 漫射光
            漫射光不同于環(huán)境光,它來自某個方向,但和環(huán)境光一樣,照射到物體時,會被反射到各個方向。

            Specular Light 鏡面光
            鏡面光和漫射光一樣是有方向的,但它反射方向是一定的,而不像漫射光一樣反射到各個方向。所以當(dāng)鏡面光照射到物體時,你會看到物體表面被照射的亮點。

            Emissive Light 發(fā)射光
            它來自于某一物體,該物體散發(fā)出大量的光,但不會被任何物體面反射。

            為了更好的理解這幾種光,我從網(wǎng)絡(luò)上摘抄了一段定義:
                * 環(huán)境光——經(jīng)過多次反射而來的光稱為環(huán)境光,無法確定其最初的方向,但當(dāng)特定的光源關(guān)閉后,它們將消失.
                * 全局環(huán)境光——它們并非來自特定的光源,這些光經(jīng)過了多次散射,已經(jīng)無法確定其光源位于何處.
                * 散射光——來自同一方向,照射到物體表面后,將沿各個方向均勻反射,因此,無論從哪個方向觀察,表面的亮度都相同.
                * 鏡面反射光——來自特定方向,也被反射到特定方向.鏡面反射度與之相關(guān).
                * 材質(zhì)發(fā)射光——用于模擬發(fā)光物體.在OpenGL光照模型中,表面的發(fā)射光增加了物體的亮度,它不受光源的影響,另外,發(fā)射光不會給整個場景中增加光線.

            材質(zhì)

            你不光可以設(shè)置光的屬性,而且還可以指定不同的面對光照作出的反應(yīng),這就要指定材質(zhì)屬性。
            這就指定了一個面對光源反射多少。

            法線

            法線是一個向量垂直于(90度)某一特定面,就稱這個向量是某個面的法線。法線可以用于光的計算。如果你想讓畫出的物體對光源產(chǎn)生影響,那么必須指定物體每個面的法線。下面將會說明。

            另一個需要注意的一點是,法線要單位化,我們不會深入數(shù)學(xué)計算,這不是我們這章的目的。如果需要會在將來某章中講解。簡明的說,一個向量的長度等于各個向量分量的平方和的平方根,再把每個向量的分量除以這個值。現(xiàn)在不需要過多擔(dān)心這個。

            程序代碼:

            下面定義兩個顏色數(shù)組,一個用于環(huán)境光,一個用于漫射光,它們是光源的顏色值。
            float lightAmbient[] = { 0.2f, 0.3f, 0.6f, 1.0f };
            float lightDiffuse[] = { 0.2f, 0.3f, 0.6f, 1.0f };

            下面創(chuàng)建一個材質(zhì)屬性數(shù)組,分別用于環(huán)境光和漫射光。
            用材質(zhì)屬性值乘以光源值得出面的反射顏色值,下面的值將會導(dǎo)致面反射的光失去接收光的百分之四十。每個值表示特定顏色被反射的數(shù)量。
            float matAmbient[] = { 0.6f, 0.6f, 0.6f, 1.0f };
            float matDiffuse[] = { 0.6f, 0.6f, 0.6f, 1.0f };

            void init()
            {
            首先先啟用光源,這樣光才會在場景中起作用。
            glEnable(GL_LIGHTING);

            opengl最多允許8個光源,要使用某個光源,需要使用glEnable打開它,光源的編號是GL_LIGHTX,X的值是0---7。
            指定材質(zhì)屬性,可以使用glMaterialfv和glMaterialf ,glMaterialfv接受向量數(shù)組,而glMaterialf只接受一個向量。第一個參數(shù)指定那個面被更新,在opengl es中只可以使用GL_FRONT_AND_BACK,其他參數(shù)不起作用。之所以存在這個參數(shù),是因為opengl可以設(shè)置多個參數(shù)。
            第二個參數(shù)指定光源的類型,GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION 和 GL_AMBIENT_AND_DIFFUSE. 
            最后一個參數(shù)指定一個數(shù)組或單個值,取決于你使用的哪個函數(shù)。

            下一行設(shè)置面的材質(zhì)屬性:
                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
                glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);

            燈光的設(shè)置和材質(zhì)的設(shè)置相同,使用glLightfv或glLightf函數(shù):
                glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
                glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);

            init函數(shù)沒有發(fā)生改變:    
                glEnable(GL_DEPTH_TEST);
                glDepthFunc(GL_LEQUAL);

                glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
                glClearDepthf(1.0f);

                glVertexPointer(3, GL_FLOAT, 0, box);
                glEnableClientState(GL_VERTEX_ARRAY);

                glEnable(GL_CULL_FACE);
                glShadeModel(GL_SMOOTH);
            }

            display函數(shù)的開頭部分沒有發(fā)生改變:
            void display()
            {
               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
               glLoadIdentity();

               gluLookAtf(
                    0.0f, 0.0f, 3.0f,
                    0.0f, 0.0f, 0.0f,
                    0.0f, 1.0f, 0.0f);

               glRotatef(xrot, 1.0f, 0.0f, 0.0f);
               glRotatef(yrot, 0.0f, 1.0f, 0.0f);

            前面我們討論了法線,法線是垂直于面的,所以前平面的法線是(0, 0, 1),后平面的法線是(0, 0, -1),兩個法線的長度為1,所以不用再單位化。
            法線由glNormal3f 函數(shù)指定,并在渲染時調(diào)用。這個函數(shù)由3個float類型的數(shù)據(jù)組成單位化的向量。
               // FRONT AND BACK
               glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
               glNormal3f(0.0f, 0.0f, 1.0f);
               glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
               glNormal3f(0.0f, 0.0f, -1.0f);
               glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
               
               其他頁面設(shè)置也同上,

               // LEFT AND RIGHT
               glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
               glNormal3f(-1.0f, 0.0f, 0.0f);
               glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
               glNormal3f(1.0f, 0.0f, 0.0f);
               glDrawArrays(GL_TRIANGLE_STRIP, 12, 4);

               // TOP AND BOTTOM
               glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
               glNormal3f(0.0f, 1.0f, 0.0f);
               glDrawArrays(GL_TRIANGLE_STRIP, 16, 4);
               glNormal3f(0.0f, -1.0f, 0.0f);
               glDrawArrays(GL_TRIANGLE_STRIP, 20, 4);

               glFlush();
               glutSwapBuffers();
            }

            最后菜單增加一項彩色材質(zhì),這項選擇打開或關(guān)閉色彩跟蹤。色彩跟蹤根據(jù)當(dāng)前面的色彩反色不同色的光。

                case 2 : 
                    if (glIsEnabled(GL_COLOR_MATERIAL))
                        glDisable(GL_COLOR_MATERIAL);
                    else
                        glEnable(GL_COLOR_MATERIAL);
                    break;

            下面兩張圖是程序的運行結(jié)果,分別是普通燈光和色彩追蹤的效果。
               普通燈光         色彩跟蹤
            15-Lighting.gif

               15-Lighting01.jpg



            現(xiàn)在學(xué)會了在場景中添加燈光,它提供了靈活的設(shè)置,使得場景更加真實。

            posted on 2011-01-10 18:39 大龍 閱讀(1837) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久亚洲国产午夜精品理论片| 亚洲国产精品综合久久网络| 久久国产精品无码一区二区三区| 国产精品久久永久免费| 66精品综合久久久久久久| 久久久久久国产精品无码下载 | 久久精品国产亚洲AV无码娇色 | 久久国产精品成人影院| 午夜视频久久久久一区| 国产精品美女久久久久网| 久久只有这精品99| 国产激情久久久久影院| 亚洲精品白浆高清久久久久久| 久久精品国产WWW456C0M| 久久香蕉超碰97国产精品| 久久笫一福利免费导航 | 久久久久久亚洲精品成人| 久久精品亚洲欧美日韩久久| 精品少妇人妻av无码久久| 久久久久国产精品人妻| 久久激情亚洲精品无码?V| 久久99热狠狠色精品一区| 久久精品亚洲一区二区三区浴池 | 久久久久黑人强伦姧人妻| 狠狠色丁香婷综合久久| 2020久久精品国产免费| 人妻久久久一区二区三区| 欧美激情一区二区久久久| 久久精品国产黑森林| 国产精品美女久久久免费| 99久久婷婷免费国产综合精品| 久久亚洲私人国产精品| 色婷婷久久综合中文久久蜜桃av| 久久狠狠爱亚洲综合影院| 热久久最新网站获取| 久久se精品一区精品二区国产| 国产 亚洲 欧美 另类 久久| 精品无码久久久久久久久久 | 国产午夜电影久久| 久久精品视屏| 伊人久久亚洲综合影院|