Direct3D進行Alpha混合實現半透明效果

2021-08-26 17:29:55 字數 2129 閱讀 1032

這次給大家奉獻的是我最近學習directx基礎的一些內容:進行alpha混合。雖然我在很多的遊戲中看到了美輪美奐的半透明效果,但是能夠自己製作出半透明的效果還是一件非常欣慰的事情。因為這不僅僅是自己目的的達成,還是自己自學能力的提公升。

alpha是畫素顏色中的乙個值,但是改變它並不能改變任何顏色,而是改變它的透明度。它佔乙個位元組,也就是說它的取值範圍為從0到255。0代表完全看不見,255表示完全不透明。為此我記住了兩個英文單詞:transparent和opaque。為了能夠使用alpha製作出半透明的效果,要在d3d裝置上呼叫乙個函式來啟用它。這個函式就是setrenderstate。下面就是啟用alpha混合的典型用法:

// 設定alpha混合

m_pdevice->setrenderstate( d3drs_alphablendenable, true );

m_pdevice->setrenderstate( d3drs_srcblend, d3dblend_srcalpha );

m_pdevice->setrenderstate( d3drs_destblend, d3dblend_invsrcalpha );

//其它複雜的我也沒有看懂,反正alpha混合是在光柵化(rasterization)上進行的。其中還有很多其它的操作,但是在初級階段是用不著啦。所以我也暫時不研究了。它在《real time rendering》這本書裡有。這裡是我的修改的專案,就是將以前的專案稍微進行了修改,就可以顯示這樣的效果了:

// renderbyfiledialog.cpp alpha半透明效果的實現檔案

// 2023年2月26日13:35:02 最後編輯

#include // atl應用程式基礎庫

#include // 包含wtl開啟檔案的對話方塊

#include "renderbyfiledialog.h"

#include "resource.h" // 資源標頭檔案

#define safe_release( p ) if ( p )

crenderbyfiledialog::crenderbyfiledialog( hinstance hinst, hwnd hwnd,

lpdirect3ddevice9 pdevice,

int width, int height )// 建構函式

unsigned long crenderbyfiledialog::release( void ) // 釋放空間

void crenderbyfiledialog::centerimage( d3dximage_info& imageinfo, stvertex* vertices ) // 居中

void crenderbyfiledialog::browseimagefile( void ) // 瀏覽並且獲取影象檔案的路徑

}void crenderbyfiledialog::draw( void ) // 繪圖

if ( m_immediateinput.keydown( dik_up ) )

if ( m_immediateinput.keydown( dik_down ) )

if ( m_immediateinput.keydown( dik_left ) )

if ( m_immediateinput.keydown( dik_right ) )

}

這樣還不夠。因為僅僅是實現了啟用alpha載入檔案,但是檔案在建立的時候也必須是帶有alpha值的。下面我就用自己常用的photoshop cs4和easypainttoolsai來演示一下。

在photoshop新建對話方塊裡,選擇背景為透明,如下圖:

隨後為了簡單起見,僅僅使用單圖層,並且使用漸變的效果來演示。將漸變的不透明度調整為50%,如下圖:

繪製完後儲存為png格式檔案,然後可以在程式中載入,結果如下圖所示:

使用easypainttoolsai也非常簡單:在控制面板中調整圖層的不透明度,然後點另存為,如下圖:

另存為png格式之後提示乙個對話方塊,選擇下面帶有alpha值的就是了,要不然你繪製的帶有alpha值的是不會顯示半透明效果的,因為它根本就沒有儲存起來嘛。

最後顯示的效果如下圖所示:

Direct3D入門 一 配置Direct3D環境

b url 先鋒隊 北京貝武易科技公司 b 我們要編寫directx direct3d 程式,需要先安裝兩個檔案 directx sdk directx開發包 這個開發包大,大概500兆 url 執行環境 這個檔案小,大概30 40兆 url 很多初學者會混淆了這個兩個directx有什麼區別。乙個...

Direct3D 多重取樣抗鋸齒

多重取樣抗鋸齒 multisampling atialiasing 針對光柵化顯示器抗鋸齒的方法有多種,在d3d中採用的多重取樣方法。即在每個畫素點內部,設定多個取樣點,繪製多邊形邊緣時,針對每個取樣點判斷是否被多邊形覆蓋,最終的顏色值從取樣點中取均值,以對多邊形的邊緣進行 模糊化 從而減輕鋸齒效果...

Direct3D中的霧化效果

在direct3d 中,霧化是通過將景物顏色與霧的顏色,以隨物體到觀察點距離增加而衰減的混合因子混合而實現的。兩種霧化方法 頂點霧化和畫素霧化。三種霧化公式 線性霧化,指數霧化,指數平方霧化。兩種霧化處理 基於深度的霧化處理和基於範圍的霧化處理。基於深度是指兩個點之間的深度 z 差值,基於範圍則是兩...