Direct3D中的霧化效果

來源:互聯網
上載者:User

       在Direct3D 中,霧化是通過將景物顏色與霧的顏色,以隨物體到觀察點距離增加而衰減的混合因子混合而實現的。

       兩種霧化方法:頂點霧化和像素霧化。

       三種霧化公式:線性霧化,指數霧化,指數平方霧化。

       兩種霧化處理:基於深度的霧化處理和基於範圍的霧化處理。基於深度是指兩個點之間的深度(Z)差值,基於範圍則是兩點間的直線距離。Direct3D預設的是基於深度的霧化。可設定基於範圍的霧化,但要先檢測裝置是否支援:

       g_pd3dDevice->GetDeviceCaps(&staps);

       if ( stCaps.RasterCaps & D3DPASTERCAPS_FOGRANGE )

            return TRUE;

       Direct3D預設禁用霧化效果,可以啟用霧化:g_pd3dDevice->SetRendState( D3DRS_FOGENABLE, true );

       設定霧的顏色 g_pd3dDevice->SetRendState( D3DRS_FOGCOLOR, 0xffffffff); //白色

       根據按鍵訊息進行多種霧化效果的切換

        if (gInputSystem->KeyDown(DIK_V))
        {
             //禁用霧化
             g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,FALSE );
        }

       

        if (gInputSystem->KeyDown(DIK_M))
        {

             g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
             //設定霧化混合因子計算公式 :  指數霧化
             g_pd3dDevice->GetDevice()->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_EXP);
             //設定霧的濃度

             static float fogDensity = 0.005f; 
             g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)&fogDensity);
        }

        

        if (gInputSystem->KeyDown(DIK_N))
        {

             g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );

             //啟用基於範圍的霧化
             g_pd3dDevice->SetRenderState( D3DRS_RANGEFOGENABLE,TRUE );

             //設定霧化混合因子計算公式  :  線性霧化
             g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
             //設定線性霧化開始位置和結束位置
             static float fogStart = 20;
             static float fogEnd = 200;
             g_pd3dDevice->SetRenderState(D3DRS_FOGSTART,*(DWORD*)&fogStart);     

             g_pd3dDevice->SetRenderState(D3DRS_FOGEND,*(DWORD*)&fogEnd);

        }

        
        if (gInputSystem->KeyDown(DIK_B))
        {
             g_pd3dDevice->SetRenderState( D3DRS_FOGENABLE,TRUE );
             //設定霧化混合因子計算公式 :  指數平方霧化
             g_pd3dDevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_EXP2);
             //設定霧的濃度

             static float fogDensity = 0.01f;
             g_pd3dDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)&fogDensity);
        }

       

        其中設定霧化混合因子計算公式時,SetRenderState的第一個參數可以是:

        D3DRS_FOGTABLEMODE(像素霧化)  或  D3DRS_FOGVERTEXMODE(頂點霧化)

       

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.