PIXNET Logo登入

遊戲人生 人生遊戲

跳到主文

如果工作是玩樂就太好了

部落格全站分類:攝影寫真

  • 相簿
  • 部落格
  • 留言
  • 名片
  • 1月 04 週三 201215:18
  • DirectX Mesh數據的處理

Mesh數據的處理

執行D3DXLoadMeshFromX函數完成.X文件的加載後,Mesh的各種數據將存放在頂點緩衝區,頂點索引緩衝區,材質緩衝區,鄰接頂點緩衝區,特效屬性緩衝區,網格緩衝區中。其中,材質緩衝區(包含材質信息和紋理貼圖文件名信息),鄰接頂點緩衝區以及特效屬性緩衝區的地址由 D3DXLoadMeshFromX函數成功執行後返回,其他的緩衝區地址可利用ID3DXMesh接口函數來獲得。

.X網格的渲染和優化就是使用上面緩衝區的數據來進行的。頂點緩衝區給出了整個網格的頂點坐標列表(包括頂點坐標和頂點紋理坐標),頂點索引緩衝區給出了每個三角形面的頂點構成信息(三個頂點的索引值),從而間接給出了整個網格的所有三角形面的頂點信息說明,屬性緩衝區為每個三角形面的一個網格子集編號,即給出了網格的每個三角形面的分組號。具有同一個Subset編號的三角形,將使用相同的材質和紋理對象進行渲染。

Mesh網格的渲染,可以用一個for循環來進行,循環的次數為總的材質數。每一次循環都將那些具有相同Subset子集號的三角形面渲染出來,即渲染每個子集Subset。不過每次循環首先要設置渲染管道線的材質和紋理對象,

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(106)

  • 個人分類:DirectX
▲top
  • 1月 03 週二 201210:53
  • DirectX D3DXVec3Normalize

D3DXVec3Normalize(vOut, v) 返回向量的單位向量
 說明:返回向量的單位向量,即方向不變長度為 1 的向量
 用法:D3DXVec3Normalize vOut, v
 參數:VOut As D3DVECTOR 返回計算結果的向量
    v As D3DVECTOR 欲計算其單位向量的向量

例子:

Dim VOut As D3DVECTOR,
v As D3DVECTOR,
s As Single,
s1 As Single


v.x = 1
v.y = 2
v.z = 3

D3DXVec3Normalize (VOut, v)  // 用 VOut 返回 v1 的單位向量
s = D3DXVec3Length(v) //計算原向量的長度:返回 3.74
s1 = D3DXVec3Length(VOut) '計算 VOut 的長度:返回 1,果然是為1的單位向量



(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(106)

  • 個人分類:DirectX
▲top
  • 1月 02 週一 201215:30
  • DirectX 基本步驟

開始
DX程序第一件事是創建DX對象,相當於初始化DirectX。
LPDIRECT3D9X g_pD3D = Direct3DCreate9( D3D_SDK_VERSION);
if(NULL == g_pD3D) return E_FAILE;
每個程序都是由此開始的,而且寫法都一樣,參數必須是D3D_SDK_VERSION。

創建設備
DirectX是位於硬件抽象層上的設備,程序員通過訪問DX提供的接口來間接操作設備。設備大致分為
1. HAL設備。硬件抽象層的主要設備,硬件加速即在此處理。
2. 軟件設備。當某種特效硬件不支持,那麼可以用軟件的方法,讓CPU來計算,因此這稱為軟件設備。
3. 參考設備。無論有無硬件,都使用CPU來計算。
了解了設備的種類後,接下來就是創建設備了。
CreateDevice( UINT Adapter,
D3DDEVTYPE DeviceType,
HWND hFocusWindow,
DWORD BehaviorFlags,
D3DPRESENT_PARAMETERS *pPresentationParameters,
IDirect3DDevice9** ppReturnedDeviceInterface
);
Adapter 指定顯示適配器序列號,用於指示哪塊顯卡創建Direct3D對象,顯然,當有多塊顯卡時或顯卡上有多個接口時,這個參數能起來區分作用。我沒有找到如何獲取此值的API,只看文檔上提到“先取得顯卡設備,再枚舉Adpater”。通常這個參數D3DADAPTER_DEFAULT(這是一個宏,其值是當前適配器的序列號)。
DeviceType 這便是上面提到的3種設備。D3DDEVTYPE是個枚舉,D3DDEVTYPE_HAL代表HAL設備,通常也是取這個值。
hFocusWindow 指出那個窗口取得焦點。
BehaviorFlags 設備的工作方式。是一些細節問題,通常用D3DCREATE_SOFTWARE_VERTEXPROCESSING,表示頂點由軟件運算。
D3DPRESENT_PARAMETERS 本結構很複雜,也很重要。
typedef struct _D3DPRESENT_PARAMETERS_ {
UINT BackBufferWidth, BackBufferHeight;
D3DFORMAT BackBufferFormat;
UINT BackBufferCount;
D3DMULTISAMPLE_TYPE MultiSampleType;
DWORD MultiSampleQuality;
D3DSWAPEFFECT SwapEffect;
HWND hDeviceWindow;
BOOL Windowed;
BOOL EnableAutoDepthStencil;
D3DFORMAT AutoDepthStencilFormat;
DWORD Flags;
UINT FullScreen_RefreshRateInHz;
UINT PresentationInterval;
} D3DPRESENT_PARAMETERS;
●BackBufferWidth, BackBufferHeight 指定後台緩衝窗口的寬度和高度。當程序在非全屏模式下,如果它們為0,即是默認窗口的大小。
●BackBufferFormat 指定後台緩衝區像素格式。像素格式就不多說了。
●BackBufferCount 後台緩衝區的數量。可取0,1,2和3。取0時與到1一樣,表示1個緩衝區。緩衝區的數量與交換鏈有關,這個稍後討論。
●MultiSampleType 指定多重采樣數量。采樣越多,反鋸齒效果越好。
●MultiSampleQuality 多重采樣的質量。取值範圍是0到1,並且小於CheckDeviceMultiSampleType返值。因為反鋸齒效果需要一定資源,如果采樣數量過多或質量過高,可能系統達不到要求。所以如果需要反鋸齒,那麼最好用這個API檢測是否合適。
●SwapEffect 設置後台緩存複製到前台的方式。注意的是,如果設置不是D3DSWAPEFFECT_DISCARD(複製到前台後清除後台緩存內容)時,多重采樣必須是0( D3DMULTISAMPLE_NONE)。
●hDeviceWindow 指定圖形繪製窗口。默認時為當前被激活的窗口。
●Windowed 如果為TRUE,則以窗口方式顯示,反之以全屏方式顯示。
●EnableAutoDepthStencil,AutoDepthStencilFormat,Flags, FullScreen_RefreshRateInHz?

CreateDevice的參數差不多就講完了。最複雜的要數D3DPRESENT_PARAMETERS參數了,不過很多時候用默認值0就可以了,所以常見的CreateDevice是這樣寫的

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
d3dpp.Windowed = TRUE; //窗口模式
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
//表示像素模式與適配器的相同
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
return E_FAIL;
Direct3D應用程序的基本結構
Direct3D應用程序的基本結構分為:
1. 初始化Direct3D
2. 渲染圖形
3. 如果程序不退出,GOTO 2
3. 結束Direct3D
上面CreateDevice部分大致就是Direct3D初始化了,接下來是渲染圖形
VOID Render( )
{
//清空後台緩衝區
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
//後台緩衝區繪製圖形
……

//線束後台緩衝區渲染
g_pd3dDevice->EndScene();
}
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
從這段代碼可以看出,DX圖形繪製是在後台緩衝區進行的,而且代碼位於BeginScene和EndScene之間。
清空後台緩衝區也是有意思函數,第一、二參數代表清空的區域,當設置為0和NULL時代表清空整個窗口。第三個參數是D3DCLEAR枚舉組合,它有三個值D3DCLEAR_TARGET,D3DCLEAR_ZBUFFER, D3DCLEAR_STENCIL。TARGET即表面象素的顏色,ZBUFFER即是深度緩衝區,STENCIL代表蒙板,打個比方,賽車遊戲中,車子窗外的景色的變,而車內的一般不變,所以可以設個蒙板,使每次刷新只改變窗外的區域。第四、五、六個參數就是分別對應上面三個枚舉值了。
提到渲染,一個重要的概念就是表面及表面管理。表面就像是存放在內存(顯存)中的一張位圖;前台緩衝區,是由顯卡傳送到顯示器的一塊內存,它是不能被DX寫入的;後台緩衝區,是DX真正繪圖的地方;表面翻轉(flipping surfaces),將後台提交到前台的過程稱之為表面翻轉;交換鏈,後台與前台表面指針所組成的循環鏈表,以便快速、有序地提交後台表面到前台,而且不必再分配新內存(原來的前台表面指針放到後台緩衝表面鏈表的後面,相當於把前台表面用於後台表面)。

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(1) 人氣(641)

  • 個人分類:DirectX
▲top
  • 1月 02 週一 201215:20
  • DirectX CDXUTDialog

DirectX 範例裡面的 CDXUTDialog
CDXUTDialog g_HUD; // manages the 3D UI
CDXUTDialog g_SampleUI; // dialog for sample specific controls

一樣可以用回呼function
g_HUD.Init( &g_DialogResourceManager );
g_HUD.SetCallback( OnGUIEvent );


CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs 對話共享資源的管理者

need create Device
g_DialogResourceManager.OnCreateDevice( pd3dDevice )


add new button
g_HUD.AddButton( IDC_TOGGLEFULLSCREEN, L"Toggle full screen", 35, iY, 125, 22 );

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(73)

  • 個人分類:DirectX
▲top
  • 12月 26 週一 201123:49
  • C# 雙引號或反斜線 record

C# 字串變數, 如何包含雙引號或反斜線

如果字串裡包括特殊符號,例如換行符號,雙引號等,可以用\,例如\" 表示雙引號


以下是其他的範例
string a="abc\"dd"; //以 \" 表示雙引號
string b= "C:\\Program Files\\"; //以 \\ 表示反斜線


若在字串前加@,會比較方便撰寫,範例如下
string d = @"C:\Program Files\"; //加了@, 只需要寫一個反斜線即可,會比較簡單
string e = @"""C:\Program Files\"""; //加了@, 用"" 二個雙引號來表示一個雙引號

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(374)

  • 個人分類:C#
▲top
  • 12月 20 週二 201117:24
  • DirectX SetTextureStageState


DirectX9設置紋理渲染--SetTextureStageState()

函數原型 SetTextureStageState(

DWORD Stage, //當前設置的多級紋理的索引

D3DTEXTURESTAGESTATETYPE Type, //紋理渲染狀態的類型

DWORD Value //紋理渲染狀態的值,與類型相對應

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(290)

  • 個人分類:DirectX
▲top
  • 12月 19 週一 201116:50
  • C++ 用以下方式來讓單參數多重輸入

用以下方式來讓單參數多重輸入

#define D3DFVF_XYZRHW 0x002
#define D3DFVF_DIFFUSE 0x004
#define D3DFVF_TEX1 0x006
#define D3DFVF_XYZ 0x008
#define D3DFVF_NORMAL 0x00a

function a(DWORD dwFVF)
{
int f
if( dwFVF & D3DFVF_XYZ )
f += 3;
else if( dwFVF & D3DFVF_XYZRHW )
f += 4;
if( dwFVF & D3DFVF_NORMAL )
f += 5;

if( dwFVF & D3DFVF_DIFFUSE )
f += 3;

if( dwFVF & D3DFVF_TEX1 )
f += 7;
}

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(1) 人氣(102)

  • 個人分類:C++
▲top
  • 12月 19 週一 201111:59
  • XNA 4.0 REACH 版本 畫地板出現錯誤 record

在XNA 4.0用 REACH 版本,用基本特效畫出3D地板的時候,出現了以下的錯誤訊息:

XNA Framework Reach profile does not support 32 bit indices. Use IndexElementSize.SixteenBits or a type that has a size of two bytes.

google翻譯寫:

    XNA框架REACH配置文件不支持32位指數。使用IndexElementSize.SixteenBits或類型,有兩個字節的大小。

SixteenBits是16位元,

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(112)

  • 個人分類:XNA 4.0
▲top
  • 12月 15 週四 201114:08
  • 如何在Windows XP使用微軟正黑體?

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(2,875)

  • 個人分類:OS
▲top
  • 12月 08 週四 201115:37
  • XNA GraphicsDevice.RasterizerState 設定 record

XNA的作法是:
RasterizerState.CullCounterClockwise;//CullCounterClockwise 逆時針來畫模型這是GraphicsDevice的預設
1. 右手系座標系統 
2. GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; 逆時針來畫出模型

RasterizerState:
1. CullClockwise 順時針畫模型 A built-in state object with settings for culling primitives with clockwise winding order.
2. CullCounterClockwise 逆時針畫模型 A built-in state object with settings for culling primitives with counter-clockwise winding order.
3. CullNone 背面不剔除 A built-in state object with settings for not culling any primitives.

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

所以DerectX的作法是:
1. 左手系座標系統 
2. 順時鐘來畫出模型

Device->SetRenderState(D3DRS_CULLMODE, Value);
Value 可以是如下一個值:
D3DCULL_NONE——完全不使用背面揀選
D3DCULL_CW——揀選順時針環繞的三角形
D3DCULL_CCW——逆時針方向環繞的三角形會被揀選,這是預設值。

(繼續閱讀...)
文章標籤

createps 發表在 痞客邦 留言(0) 人氣(94)

  • 個人分類:XNA
▲top
«1234...20»

最新文章

    文章精選

    個人資訊

    createps
    暱稱:
    createps
    分類:
    攝影寫真
    好友:
    累積中
    地區:

    熱門文章

    • ()C# 取亂數 record
    • ()C# lock record
    • ()C# Dictionary用法 record
    • ()C# ToString 格式 record
    • ()C# 十進制轉各進制,再轉回來 record
    • ()C# GUID產生亂數字串 record
    • ()C# 除法顯示小數點 record
    • ()C# List排序 record
    • ()C 函式參數指標寫法
    • ()中華電信、無線IP分享器和網路交換器如何連接

    文章分類

    • 國外旅遊 (2)
    • C# (87)
    • 喜歡的歌 (1)
    • GRD3 (1)
    • XNA (12)
    • C++ (4)
    • Game (1)
    • Game (1)
    • Apple (3)
    • 物理 (1)
    • 歌曲 (4)
    • SQL (1)
    • FTP (2)
    • 創業 (4)
    • 笑話 (1)
    • 技巧 (2)
    • Shader (1)
    • VB.NET (2)
    • 大易 (1)
    • 輸入法 (1)
    • OS (2)
    • Unity3D (3)
    • Lua (2)
    • Corona (29)
    • DirectX (15)
    • XNA 4.0 (2)
    • 程式使用 (1)
    • 懷孕 (1)
    • Facebook (1)
    • 網路硬體 (1)
    • 未分類文章 (1)

    文章搜尋

    誰來我家

    參觀人氣

    • 本日人氣:
    • 累積人氣: