D3D自學筆記

2021-07-05 18:17:58 字數 3357 閱讀 3659

這是我建立自己的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 inputlayouts

id3d11inputlayout* 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...