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

            天行健 君子當(dāng)自強而不息

            效果框架(3)

            霧化效果(以下簡稱霧)提高了場景的真實性,可以用它來模擬逼真的天氣狀況。另外,霧可以大大減少遠剪裁面 (far-clip)在視覺上帶給觀者的不自然的感覺。Direct3D霧化是固定功能管線的一部份,受渲染狀態(tài)限制。

            下面的效果文件設(shè)置頂點霧,以達到必要的霧化狀態(tài)。注意:Direct3D也支持像素霧(也叫表格霧table fog),比頂點霧要更精確。

            /**********************************************************************************
              Effect file that handles device states for linear vertex fog.
             *********************************************************************************
            */

            technique FogTech
            {
                pass pass0
                {
                    
            // set misc render states
                    pixelshader         = null;
                    vertexshader     
            = null;
                    fvf                 
            = XYZ | Normal;
                    Lighting         
            = true;
                    NormalizeNormals 
            = true;
                    SpecularEnable   
            = false;

                    
            // fog states
                    FogVertexMode    = LINEAR;        // linear fog function
                    FogStart        = 50.0f;        // fog starts 50 units away from viewpoint
                    FogEnd            = 300.0f;        // fog ends 300 units away from viewpoint
                    FogColor        = 0x00CCCCCC;    // gray
                    FogEnable        = true;            // enable
                }
            }

             

            就象你看到的,線性頂點霧能夠通過五個簡單的渲染狀態(tài)控制:

                     FogVertexMode—使用指定的霧函數(shù)用于頂點霧。霧函數(shù)指定霧如何根據(jù)距離增長,自然界的霧在近視口的地方比較薄并且根據(jù)距離增長變得厚起來了。有效的任務(wù)類型為LINEAR、EXP、EXP2。這些函數(shù)被定義為:

            注意:如果你用EXP或EXP2霧化函數(shù),你不用設(shè)置FogStart 和 FogEnd,因為它們在這些霧函數(shù)類型中沒被用到。代替的你必須設(shè)置霧密度(fog density)渲染狀態(tài)(如,F(xiàn)ogDensity = someFloatType)

                     FogStart—標記了物體將開始霧化的起始深度。

                     FogEnd—標記了物體將結(jié)束霧化的結(jié)束深度。

            注意:FogStart 與 FogEnd本質(zhì)上定義了物體被霧化的深度間隔(從視口)。

                     FogColor—一個DWORD 或 D3DCOLOR值,以描述霧的顏色

                     FogEnable—指定true以開啟頂點霧或false以關(guān)閉頂點霧

            任何我們用FogShader.cxx效果渲染的幾何體將被霧化。通過這種方式,我們可以控制哪一物體得到霧化,而哪些不用霧化。這對只霧化特定區(qū)域是很有用的。例如,通常屋外是有霧的,屋里不被霧化。同樣的,一定地理部分可能有霧,而另外部分可能沒有。下圖展示了例程的屏幕截圖。

             

            執(zhí)行程序:

            /**************************************************************************************************
              Demonstrates using an effect file. Use the arrwo keys, and M, N, W, S, keys to move.  
             *************************************************************************************************
            */

            #include 
            "d3dUtility.h"
            #include 
            "terrain.h"
            #include 
            "camera.h"

            #pragma warning(disable : 
            4100)

            using namespace std;

            const int WIDTH  = 640;
            const int HEIGHT = 480;

            IDirect3DDevice9
            *            g_device;
            cTerrain
            *                    g_terrain;
            cCamera                        g_camera(AIR_CRAFT);
            ID3DXEffect
            *                g_fog_effect;
            D3DXHANDLE                    g_fog_tech_handle;

            ////////////////////////////////////////////////////////////////////////////////////////////////////

            bool setup()
            {    
                
            // init scene
                D3DXVECTOR3 dir_to_light(0.0f1.0f0.0f);
                g_terrain 
            = new cTerrain(g_device, "coastMountain64.raw"646460.5f);
                g_terrain
            ->generate_texture(&dir_to_light);

                
            // set texture filters
                g_device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
                g_device
            ->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
                g_device
            ->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

                
            // set camera position    
                g_camera.m_pos = D3DXVECTOR3(100.0f100.0f-250.0f);

                
            // create effect

                ID3DXBuffer
            * error_buffer;

                HRESULT hr 
            = D3DXCreateEffectFromFile(g_device, "FogShader.cxx", NULL, NULL, D3DXSHADER_DEBUG, NULL,
                                                      
            &g_fog_effect, &error_buffer);

                
            // output any error messages
                if(error_buffer)
                {
                    MessageBox(NULL, (
            char*) error_buffer->GetBufferPointer(), "ERROR", MB_OK);
                    safe_release
            <ID3DXBuffer*>(error_buffer);
                }

                
            if(FAILED(hr))
                {
                    MessageBox(NULL, 
            "D3DXCreateEffectFromFile() - FAILED""ERROR", MB_OK);
                    
            return false;
                }
                
                
            // save frequently accessed parameter handles
                g_fog_tech_handle = g_fog_effect->GetTechniqueByName("FogTech");
                
                
            // set projection
                D3DXMATRIX proj_matrix;
                D3DXMatrixPerspectiveFovLH(
            &proj_matrix, D3DX_PI * 0.25f, (float)WIDTH/HEIGHT, 1.0f1000.0f);
                g_device
            ->SetTransform(D3DTS_PROJECTION, &proj_matrix);
                    
                
            //g_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
                
                
            return true;
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            void cleanup()
            {    
                safe_delete
            <cTerrain*>(g_terrain);    
                safe_release
            <ID3DXEffect*>(g_fog_effect);    
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            bool display(float time_delta)
            {    
                
            // update the scene: allow user to rotate around scene.

                
            if(GetAsyncKeyState(VK_UP) & 0x8000f)
                    g_camera.walk(
            100.0f * time_delta);

                
            if(GetAsyncKeyState(VK_DOWN) & 0x8000f)
                    g_camera.walk(
            -100.0f * time_delta);

                
            if(GetAsyncKeyState(VK_LEFT) & 0x8000f)
                    g_camera.yaw(
            -1.0f * time_delta);
                
                
            if(GetAsyncKeyState(VK_RIGHT) & 0x8000f)
                    g_camera.yaw(
            1.0f * time_delta);

                
            if(GetAsyncKeyState('N'& 0x8000f)
                    g_camera.strafe(
            -100.0f * time_delta);

                
            if(GetAsyncKeyState('M'& 0x8000f)
                    g_camera.strafe(
            100.0f * time_delta);

                
            if(GetAsyncKeyState('W'& 0x8000f)
                    g_camera.pitch(
            1.0f * time_delta);

                
            if(GetAsyncKeyState('S'& 0x8000f)
                    g_camera.pitch(
            -1.0f * time_delta);

                D3DXMATRIX view_matrix;
                g_camera.get_view_matrix(
            &view_matrix);
                g_device
            ->SetTransform(D3DTS_VIEW, &view_matrix);

                
            // activate the technique and render

                g_device
            ->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00CCCCCC1.0f0);

                g_device
            ->BeginScene();

                
            // set the technique to use
                g_fog_effect->SetTechnique(g_fog_tech_handle);

                UINT num_passes;
                g_fog_effect
            ->Begin(&num_passes, 0);

                D3DXMATRIX world_matrix;
                D3DXMatrixIdentity(
            &world_matrix);

                
            for(UINT i = 0; i < num_passes; i++)
                {
                    g_fog_effect
            ->BeginPass(i);

                    g_terrain
            ->draw(&world_matrix, false);        

                    g_fog_effect
            ->EndPass();
                }

                g_fog_effect
            ->End();
                
                g_device
            ->EndScene();

                g_device
            ->Present(NULL, NULL, NULL, NULL);

                
            return true;
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            LRESULT CALLBACK wnd_proc(HWND hwnd, UINT msg, WPARAM word_param, LPARAM long_param)
            {
                
            switch(msg)
                {
                
            case WM_DESTROY:
                    PostQuitMessage(
            0);
                    
            break;

                
            case WM_KEYDOWN:
                    
            if(word_param == VK_ESCAPE)
                        DestroyWindow(hwnd);

                    
            break;
                }

                
            return DefWindowProc(hwnd, msg, word_param, long_param);
            }

            ///////////////////////////////////////////////////////////////////////////////////////////////////////

            int WINAPI WinMain(HINSTANCE inst, HINSTANCE, PSTR cmd_line, int cmd_show)
            {
                
            if(! init_d3d(inst, WIDTH, HEIGHT, true, D3DDEVTYPE_HAL, &g_device))
                {
                    MessageBox(NULL, 
            "init_d3d() - failed."0, MB_OK);
                    
            return 0;
                }

                
            if(! setup())
                {
                    MessageBox(NULL, 
            "Steup() - failed."0, MB_OK);
                    
            return 0;
                }

                enter_msg_loop(display);

                cleanup();
                g_device
            ->Release();

                
            return 0;
            }

             


            下載源程序


            posted on 2008-04-13 11:07 lovedday 閱讀(1319) 評論(1)  編輯 收藏 引用

            評論

            # re: 效果框架(3) 2009-06-03 10:35 fengguo8210@163.com

            你寫的技術(shù)文檔詳細且系統(tǒng),是不可多得的學(xué)習(xí)資料,可能的話出書吧,或者整理一下惠及大眾。  回復(fù)  更多評論   


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


            公告

            導(dǎo)航

            統(tǒng)計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評論

            美女久久久久久| 久久久久亚洲AV成人网人人软件| 伊人久久大香线蕉综合热线| 亚洲综合伊人久久综合| 久久99久久99精品免视看动漫| 精品国产一区二区三区久久久狼 | 久久中文字幕视频、最近更新| 久久精品成人| 97精品久久天干天天天按摩| 久久天天日天天操综合伊人av| 国产亚洲美女精品久久久2020| 丰满少妇高潮惨叫久久久| 久久亚洲精品无码播放| 久久精品国产亚洲AV无码麻豆 | 久久精品国产免费一区| 久久天天躁狠狠躁夜夜不卡| 久久最近最新中文字幕大全| 亚洲午夜无码久久久久| 日日狠狠久久偷偷色综合96蜜桃| 99国产欧美久久久精品蜜芽| 久久婷婷国产剧情内射白浆| 精品无码久久久久久久久久| 久久99国产精品久久99| 亚洲色大成网站www久久九| 久久夜色精品国产www| 久久综合九色综合久99| 久久亚洲欧美国产精品| 国产A级毛片久久久精品毛片| 久久久久18| 日韩影院久久| 香蕉99久久国产综合精品宅男自| 久久激情亚洲精品无码?V| 伊人丁香狠狠色综合久久| 免费观看久久精彩视频| 久久99国产精品二区不卡| 夜夜亚洲天天久久| 久久久久久亚洲精品不卡| 国产亚洲精久久久久久无码AV| 久久精品国产黑森林| 人妻无码精品久久亚瑟影视| 一级做a爰片久久毛片毛片|