這是我建立自己的d3d程式的第一篇文章,也算是自學龍書11的學習乙個階段性總結,儘管認真看了龍書11,但還是有很多**要一邊敲,以便參考龍書配套的**。這個程式是在已經把程式框架建好了(程式框架包括初始化視窗,訊息處理函式,時間函式,執行步驟)的基礎之上做出的。
(一)首先,我們要用乙個結構定義點(點由 位置 顏色 紋理等構成),然後對構成點的元素(位置 顏色 紋理等)進行描述。
然後,我們建立effect檔案,實現基本的操作(座標變換)和一些特效(光照,紋理等)。
最後,我們運用上面的「描述」和「effect檔案」建立inputlayout,並將inputlayout繫結到輸入裝配階段,這樣管線就可以訪問到了。
(二)具體資料(每個頂點具體位置,顏色值等)我們應該把它存到快取裡面,讓管線可以訪問,結合上面的effect,就可以渲染了。
首先,描述我們要建立的」快取「
然後,描述我們要的具體點,具體索引。
最後,用建立快取,並繫結到輸入裝配階段。
上面兩大步就完成了輸入裝配階段。其實effect檔案也把vs階段和ps階段給」描述「了。
(一)結構定義點
namespace vertex
}
構成點的元素(位置 顏色 紋理等)進行描述
class inputlayoutdec
;
const d3d11_input_element_desc inputlayoutdec::cubevertexs =,
};
建立effect檔案
cbuffer cbperobject
;void vs(float3 iposl : position, float4 icolor : color,
out float4 oposh : sv_position,
out float4 ocolor : color)
float4 ps(float4 posh: sv_position,float4 color : color) : sv_target
technique11 colortech
}
編譯、建立effect
#pragma region effect
class effect
;#pragma endregion
//下面根據具體內容可作修改
#pragma region basiceffect
class basiceffect : public effect
id3dx11effecttechnique* tech;
id3dx11effectmatrixvariable* worldviewproj;
};#pragma endregion
#pragma region effects
class effects
;#pragma endregion
#include "effect.h"
#pragma region effect
effect::effect(id3d11device* device, const std::wstring& filename)
: mfx(0)
effect::~effect()
#pragma endregion
#pragma region basiceffect
basiceffect::basiceffect(id3d11device* device, const std::wstring& filename)
: effect(device, filename)
basiceffect::~basiceffect()
#pragma endregion
#pragma region effects
basiceffect* effects::basicfx = 0;
void effects::initall(id3d11device* device)
void effects::destroyall()
#pragma endregion
建立inputlayout
class inputlayouts
;
#pragma region inputlayoutsid3d11inputlayout* inputlayouts::cube = 0;
void inputlayouts::createinputlayouts(id3d11device* device)
, ,,,
,,
,}; d3d11_buffer_desc vbd;
vbd.usage = d3d11_usage_immutable;
vbd.bytewidth = sizeof(vertex::cubevertex) * 8;
vbd.bindflags = d3d11_bind_vertex_buffer;
vbd.cpuaccessflags = 0;
vbd.miscflags = 0;
vbd.structurebytestride = 0;
d3d11_subresource_data vinitdata;
vinitdata.psysmem = cubevertices;
hr(md3ddevice->createbuffer(&vbd, &vinitdata, &mvb));
uint indices [36] =
; // 要建立的索引的描述
d3d11_buffer_desc ibd;
ibd.usage = d3d11_usage_immutable;
ibd.bytewidth = sizeof(uint) * 36;
ibd.bindflags = d3d11_bind_index_buffer;
ibd.cpuaccessflags = 0;
ibd.miscflags = 0;
ibd.structurebytestride = 0;
// 設定用於初始化索引緩衝的資料
d3d11_subresource_data iinitdata;
iinitdata.psysmem = indices;
// 建立索引緩衝
hr(md3ddevice->createbuffer(&ibd, &iinitdata, &mib));
};
hr(mswapchain->present(0, 0));}
配套**:
D3D學習筆記(四)
光照 光照可分為環境光,漫射光,鏡面光三種 三種顏色的光均可用d3decolorvalue或d3dxcolor來表示,描述光線的顏色時,d3dxcolor中的alpha值將被忽略 材質 材質可用結構d3dmaterial9來表示 typedef struct d3dmaterial9d3dmater...
D3D學習筆記(七)
幾何資訊 id3dxbasemesh介面包含乙個頂點快取和乙個索引快取,可用以下方法得到指向這些介面的指標。hresult id3dxmesh getvertexbuffer9 vb 0 hresult id3dxmesh getindexbuffer9 ib 0 如果想鎖定快取進行讀寫操作,那麼可...
D3D學習筆記 繪製
1 頂點 索引緩衝區 頂點 索引緩衝區是一片儲存著頂點 索引資料的記憶體。頂點緩衝區通過idirect3dvertexbuffer9介面來定義的。索引緩衝區時通過idirect3dindexbuffer9介面來定義的。1.1 建立乙個頂點緩衝區和乙個索引緩衝區 建立頂點緩衝區函式原型 hresult...