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

              C++博客 :: 首頁(yè) :: 聯(lián)系 ::  :: 管理
              163 Posts :: 4 Stories :: 350 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(48)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            積分與排名

            • 積分 - 401318
            • 排名 - 59

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            這一課我們將介紹體積霧,為了運(yùn)行這個(gè)程序,你的顯卡必須支持?jǐn)U展"GL_EXT_fot_coord"。

            #include <windows.h>                               
            #include <gl\gl.h>                           
            #include <gl\glu.h>                               
            #include <math.h>                               

            #include "NeHeGL.h"                           

            #pragma comment( lib, "opengl32.lib" )                       
            #pragma comment( lib, "glu32.lib" )                   

            GL_Window*    g_window;                       
            Keys*        g_keys;                               
             
             
             下面的代碼設(shè)置霧的顏色和攝像機(jī)在Z方向的深度 
             
             

            GLfloat    fogColor[4] = {0.6f, 0.3f, 0.0f, 1.0f};                    // 霧的顏色
            GLfloat camz;                                    // 攝像機(jī)在Z方向的深度

              
             下面變量GL_FOG_COORDINATE_SOURCE_EXT和GL_FOG_COORDINATE_EXT具有初值,他們?cè)趃lext.h文件中被定義,這里我們必須感謝Lev Povalahev,它創(chuàng)建了這個(gè)文件。如果你想編譯你的代碼,你必須設(shè)置這個(gè)值。
            為了使用glFogCoordfExt,我們需要定義這個(gè)函數(shù)的指針,并在程序運(yùn)行時(shí)把它指向顯卡中的函數(shù)。
             
              

            // 使用FogCoordfEXT它需要的變量
            #define GL_FOG_COORDINATE_SOURCE_EXT    0x8450                    // 從GLEXT.H得到的值
            #define GL_FOG_COORDINATE_EXT        0x8451                   

            typedef void (APIENTRY * PFNGLFOGCOORDFEXTPROC) (GLfloat coord);        // 聲明霧坐標(biāo)函數(shù)的原形

            PFNGLFOGCOORDFEXTPROC glFogCoordfEXT = NULL;                    // 設(shè)置霧坐標(biāo)函數(shù)指針為NULL

            GLuint    texture[1];                            // 紋理

              
             Nehe的原文介紹了Ipicture的接口,它不是我們這一課的重點(diǎn),故我還是使用以前的方法加載紋理。 
              
              
             下面的代碼用來(lái)檢測(cè)用戶的顯卡是否支持EXT_fog_coord擴(kuò)展,這段代碼只有在你獲得OpenGL渲染描述表后才能調(diào)用,否則你將獲得一個(gè)錯(cuò)誤。
            首先,我們創(chuàng)建一個(gè)字符串,來(lái)描述我們需要的擴(kuò)展。接著我們分配一塊內(nèi)存,用來(lái)保存顯卡支持的擴(kuò)展,它可以通過(guò)glGetString函數(shù)獲得。接著我們檢測(cè)是否含有需要的擴(kuò)展,如果不存在,則返回false,如存在我們把函數(shù)的指針指向這個(gè)擴(kuò)展。 
              

            int Extension_Init()
            {
                char Extension_Name[] = "EXT_fog_coord";

                // 返回?cái)U(kuò)展字符串
                char* glextstring=(char *)malloc(strlen((char *)glGetString(GL_EXTENSIONS))+1);
                strcpy (glextstring,(char *)glGetString(GL_EXTENSIONS));       

                if (!strstr(glextstring,Extension_Name))                // 查找是否有我們想要的擴(kuò)展
                    return FALSE;                           

                free(glextstring);                            // 釋放分配的內(nèi)存

                // 獲得函數(shù)的指針
                glFogCoordfEXT = (PFNGLFOGCOORDFEXTPROC) wglGetProcAddress("glFogCoordfEXT");

                return TRUE;
            }

              
             下面的代碼初始化OpenGL,并設(shè)置霧氣的參數(shù)。 
              

            BOOL Initialize (GL_Window* window, Keys* keys)                    //初始化
            {
                g_window    = window;                       
                g_keys        = keys;                           

                // 初始化擴(kuò)展
                if (!Extension_Init())                           
                    return FALSE;                           

                if (!BuildTexture("data/wall.bmp", texture[0]))                // 創(chuàng)建紋理
                    return FALSE;                           

                glEnable(GL_TEXTURE_2D);                       
                glClearColor (0.0f, 0.0f, 0.0f, 0.5f);                   
                glClearDepth (1.0f);                           
                glDepthFunc (GL_LEQUAL);                       
                glEnable (GL_DEPTH_TEST);                       
                glShadeModel (GL_SMOOTH);                       
                glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);           
              
             下面的代碼設(shè)置霧氣的屬性
            最后一個(gè)設(shè)置為霧氣基于頂點(diǎn)的坐標(biāo),這運(yùn)行我們把霧氣放置在場(chǎng)景中的任意地方。
             
              

                glEnable(GL_FOG);                           
                glFogi(GL_FOG_MODE, GL_LINEAR);                       
                glFogfv(GL_FOG_COLOR, fogColor);                   
                glFogf(GL_FOG_START,  1.0f);                       
                glFogf(GL_FOG_END,    0.0f);                       
                glHint(GL_FOG_HINT, GL_NICEST);                       
                glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);        //設(shè)置霧氣是基于頂點(diǎn)的坐標(biāo)的

                camz =    -19.0f;                               

                return TRUE;                           
            }
              
             下面的代碼繪制具體的場(chǎng)景 
              

            void Draw (void)
            {
                glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);           
                glLoadIdentity ();                           

                glTranslatef(0.0f, 0.0f, camz);                       

              
             下面的代碼繪制四邊形組成的墻,并設(shè)置每個(gè)頂點(diǎn)的紋理坐標(biāo)和霧坐標(biāo) 
              

                glBegin(GL_QUADS);                            //后墻
                     glFogCoordfEXT(0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f,-2.5f,-15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f,-2.5f,-15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f, 2.5f,-15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f, 2.5f,-15.0f);
                glEnd();

                glBegin(GL_QUADS);                            // 地面
                     glFogCoordfEXT(0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f,-2.5f,-15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f,-2.5f,-15.0f);
                    glFogCoordfEXT(1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f,-2.5f, 15.0f);
                    glFogCoordfEXT(1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f,-2.5f, 15.0f);
                glEnd();

                glBegin(GL_QUADS);                            // 天花板
                    glFogCoordfEXT(0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f, 2.5f,-15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f, 2.5f,-15.0f);
                    glFogCoordfEXT(1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f, 2.5f, 15.0f);
                    glFogCoordfEXT(1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f, 2.5f, 15.0f);
                glEnd();

                glBegin(GL_QUADS);                            // 右墻
                    glFogCoordfEXT(1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.5f,-2.5f, 15.0f);
                    glFogCoordfEXT(1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.5f, 2.5f, 15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f, 2.5f,-15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f,-2.5f,-15.0f);
                glEnd();

                glBegin(GL_QUADS);                            // 左墻
                     glFogCoordfEXT(1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f,-2.5f, 15.0f);
                    glFogCoordfEXT(1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f, 2.5f, 15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.5f, 2.5f,-15.0f);
                    glFogCoordfEXT(0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.5f,-2.5f,-15.0f);
                glEnd();

                glFlush ();                                                                                                  
            }

              
             希望你喜歡這一課,如果你愿意的話創(chuàng)建更漂亮的體積霧吧。

             
             
            posted on 2008-01-04 21:18 sdfasdf 閱讀(1792) 評(píng)論(0)  編輯 收藏 引用 所屬分類: OPENGL
            一本色综合久久| 97精品依人久久久大香线蕉97| 亚洲精品白浆高清久久久久久 | 色诱久久久久综合网ywww| 久久精品国产99国产精品导航| 久久久久亚洲?V成人无码| 精品久久久久久无码不卡| 久久久久亚洲AV无码永不| 国产精品久久久久久久午夜片| 亚洲?V乱码久久精品蜜桃| 久久精品国产亚洲AV不卡| 成人资源影音先锋久久资源网| 国产成人无码精品久久久久免费| 亚洲中文字幕伊人久久无码 | av无码久久久久不卡免费网站| 狠狠色噜噜狠狠狠狠狠色综合久久| 国内精品久久久久久麻豆| 久久免费看黄a级毛片| 91性高湖久久久久| 色88久久久久高潮综合影院 | 91秦先生久久久久久久| 国产999精品久久久久久| 国产精品日韩深夜福利久久| 久久久精品久久久久久| 久久国产乱子伦精品免费午夜| 久久久久久国产精品无码下载 | 精品午夜久久福利大片| 人人狠狠综合久久亚洲| 久久久精品国产sm调教网站 | 伊人 久久 精品| 久久成人精品视频| 国产69精品久久久久久人妻精品| 国产无套内射久久久国产| 99热都是精品久久久久久| 精品人妻伦一二三区久久| 亚洲AⅤ优女AV综合久久久| 亚洲日本va中文字幕久久| 日日狠狠久久偷偷色综合96蜜桃| 久久99国产精品99久久| 亚洲国产精品久久电影欧美| 97久久精品人人澡人人爽|