青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

效果框架(3)

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

下面的效果文件設置頂點霧,以達到必要的霧化狀態(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ù)距離增長變得厚起來了。有效的任務類型為LINEAR、EXP、EXP2。這些函數(shù)被定義為:

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

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

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

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

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

         FogEnable—指定true以開啟頂點霧或false以關閉頂點霧

任何我們用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 閱讀(1330) 評論(1)  編輯 收藏 引用

評論

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

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


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


公告

導航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            麻豆精品视频在线观看| 欧美成人中文| 最新国产成人在线观看| 国产一区二区三区免费在线观看 | 欧美精品xxxxbbbb| 欧美第一黄色网| 欧美日韩在线影院| 国产伦精品免费视频| 国产欧美日韩精品a在线观看| 激情久久久久久久| 亚洲欧洲精品成人久久奇米网| 亚洲精品中文字幕女同| 亚洲婷婷在线| 久久综合给合| 亚洲精品欧美激情| 欧美自拍偷拍| 欧美乱在线观看| 国产自产高清不卡| 一区二区91| 久久久久久亚洲精品中文字幕| 欧美高清视频一区| 亚洲一区二区视频在线观看| 久久精品国产v日韩v亚洲| 欧美激情综合色| 国产一区二区三区四区老人| 日韩视频二区| 美日韩精品视频| 制服丝袜激情欧洲亚洲| 久久午夜视频| 国产日韩一区二区| 亚洲小说欧美另类婷婷| 欧美黑人一区二区三区| 午夜精品免费| 欧美午夜视频在线| 亚洲日韩欧美视频一区| 久久婷婷亚洲| 亚洲欧美日韩爽爽影院| 欧美日韩91| 99精品视频免费| 欧美激情亚洲国产| 久久久久久色| 国产欧美亚洲精品| 午夜日韩福利| 亚洲香蕉在线观看| 欧美日韩亚洲视频| 99视频国产精品免费观看| 欧美高清你懂得| 狂野欧美一区| 亚洲风情在线资源站| 久久久人成影片一区二区三区 | 午夜精品一区二区三区在线视 | 欧美系列亚洲系列| 日韩视频永久免费| 亚洲国产精品va| 久久一区二区三区超碰国产精品| 国产精品一区毛片| 欧美一区二区成人| 欧美亚洲日本国产| 国产日韩精品一区观看| 欧美一区二区成人| 亚洲欧美日韩在线高清直播| 国产伦精品一区二区三区| 欧美一区二区三区四区在线| 午夜精品一区二区三区在线视 | 欧美日韩xxxxx| 亚洲一区二区精品| 午夜精品成人在线| 红桃视频国产一区| 欧美成人精品一区二区三区| 久久夜色精品国产亚洲aⅴ| 亚洲高清网站| 亚洲精品美女| 国产精品午夜久久| 久久久精品视频成人| 久久久久九九九| 亚洲精品国产视频| 一本一本a久久| 国产在线精品成人一区二区三区| 麻豆精品网站| 欧美另类变人与禽xxxxx| 亚洲图片欧洲图片日韩av| 亚洲系列中文字幕| 国产一区二区三区无遮挡| 欧美黑人一区二区三区| 欧美日韩一区二区在线播放| 欧美一区二区三区在| 久热精品在线| 亚洲欧美国产精品桃花| 久久国产精品99精品国产| 亚洲区国产区| 午夜精品久久久久久久蜜桃app | 在线性视频日韩欧美| 国产欧美在线播放| 欧美成人午夜视频| 欧美午夜欧美| 欧美国产亚洲视频| 国产精品一区二区黑丝| 欧美成人精品高清在线播放| 国产精品a久久久久| 欧美成人精品激情在线观看| 国产精品视频一区二区三区| 欧美成人在线网站| 国产嫩草一区二区三区在线观看 | 欧美激情一区二区三区在线视频| 欧美久久婷婷综合色| 久久婷婷综合激情| 国产精品成人va在线观看| 老巨人导航500精品| 国产精品男gay被猛男狂揉视频| 欧美激情成人在线| 国语自产精品视频在线看抢先版结局| 亚洲三级观看| 亚洲国产小视频| 久久久久久自在自线| 欧美一级一区| 欧美性猛交99久久久久99按摩| 免费观看成人网| 国产自产在线视频一区| 亚洲欧美国产日韩中文字幕| 一区二区三区日韩欧美| 久久阴道视频| 麻豆精品精华液| 好吊妞**欧美| 欧美在线亚洲一区| 久久久国产精品一区二区中文| 欧美午夜精品久久久久久超碰| 亚洲国产三级| 99re6热只有精品免费观看| 免费亚洲电影| 欧美高清自拍一区| 亚洲第一精品影视| 久久在线视频在线| 欧美大片在线观看一区二区| 在线观看一区欧美| 久久综合久色欧美综合狠狠| 美国十次了思思久久精品导航| 国产在线拍揄自揄视频不卡99| 午夜精品美女久久久久av福利| 欧美亚洲免费电影| 国产午夜精品在线观看| 久久riav二区三区| 玖玖玖国产精品| 亚洲国产成人精品久久| 欧美成人按摩| 亚洲精品一区二区三区四区高清 | 亚洲精品乱码久久久久久久久 | 久久精品一本| 蜜桃久久精品乱码一区二区| 尹人成人综合网| 欧美成年人视频| 亚洲精品免费网站| 午夜在线精品偷拍| 国内精品久久久久久| 鲁大师成人一区二区三区 | 久久久久久97三级| 欧美激情精品久久久久久久变态| 亚洲精选在线| 国产精品女主播| 久久久久久亚洲综合影院红桃| 亚洲国产精品精华液网站| 亚洲国产综合视频在线观看| 国产精品一区一区三区| 性色一区二区三区| 欧美激情亚洲激情| 亚洲欧美成人| 在线精品国产成人综合| 欧美精品一区二区三| 亚洲视频网在线直播| 麻豆精品精华液| 亚洲视频一区在线观看| 国产一区二区日韩精品| 欧美激情视频网站| 欧美一级在线亚洲天堂| 亚洲欧洲一区二区三区久久| 新67194成人永久网站| 亚洲国产成人在线播放| 国产精品久久久久9999高清| 久久亚洲春色中文字幕久久久| 日韩一级不卡| 欧美超级免费视 在线| 亚洲自拍啪啪| 亚洲人成77777在线观看网| 国产欧美激情| 欧美日韩中文在线| 免费黄网站欧美| 午夜影视日本亚洲欧洲精品| 亚洲人成网站在线观看播放| 久久中文精品| 久久国产精品高清| 亚洲无线一线二线三线区别av| 在线免费观看日本一区| 国产日韩精品一区二区浪潮av| 欧美日韩国产色视频| 美女脱光内衣内裤视频久久网站| 午夜激情一区| 中文日韩在线| 一区二区三区精品国产| 最新日韩在线| 亚洲国产午夜| 亚洲欧洲免费视频|