DirectX 渲染 學習筆記 1

2021-08-08 14:39:43 字數 4050 閱讀 6722

在2d遊戲中乙個遊戲的渲染部分一般有如下共同的資訊:

紋理貼圖和精靈

精靈是一種特殊的物件型別.一般是出現在螢幕上的2d和3d圖形元素。

在2d遊戲中,精靈不僅僅表示角色,還可以表示背景,遊戲物件,**,和任何單個的元素,甚至是能夠繪製出來的項

頂點:定義在遊戲圖形中的形狀其實是一系列點以及它們之間相互連線的邊的集合

位置:postition

顏色:color

法線向量:normal vector

貼圖座標: texture coordinate

s-tangent 用於法線對映

bi-normal 用於發現對映

骨骼重量和索引, 用於骨骼動畫

光照對映座標

每個點的環境光遮罩因子

一般來說我們先定義定點的位置,再來定義其他的性質.

許多渲染效果的工作使用每個畫素的資料代替使用每個頂點的資料

我們不能從幾何體中直接得出每個畫素的資料,這些畫素的資料是通過插值計算得來的

向量的定義:

struct vector2d

struct vector3d

一塊buffer就是一段有具體尺寸的記憶體。如果有100char型別的陣列 那麼就有一塊100位元組的快取

如果是intergers型的 那麼就可以說有一塊整型快取 大小為4bytes x 100 interger = 400 bytes

一塊定點快取是乙個型別為id3d11buffer的direct3d快取,它用於儲存乙個網格模型的所有頂點資料

當direct3d渲染我們的物件時,它通過圖形匯流排來變換快取資訊,通過渲染管線執行必要的操作來最終決定幾何圖形是否被渲染在螢幕上

該技術決定是否幾何圖形預先可見,並且只提交那些可見或者潛在可見的圖形給圖形硬體處理

xmffloat3屬性: 定義了乙個3d向量

struct xmfloat3 ;

xm表示它來自xna數學庫

float 表示該結構的內部資料型別

3表示該結構內有多少成員

vertexpos vertices = ;                                          //定義定點列表,通過3個頂點來定義三角形 

d3d11_buffer_desc vertexdesc; //建立乙個描述快取物件

zeromemory(&vertexdesc, sizeof(vertexdesc));

vertexdesc.usage = d3d11_usage_default;

vertexdesc.bindflags = d3d11_bind_vertex_buffer;

vertexdesc.bytewidth = sizeof(vertexdesc) * 3;

d3d11_subresource_data resourcedata; //建立子資源,使用它來傳遞定點資料給快取建立函式

zeromemory(&resourcedata, sizeof(resourcedata));

resourcedata.psysmem = vertices; //psysmem是乙個已經初始化的指標, 傳送給快取填充的記憶體

id3d11buffer* vertexbuffer;

hresult result = d3ddevice_->createbuffer(&vertexdesc, &resourcedata, &vertexbuffer); //建立快取

子資源的結構:

d3d11_subresource_data

d3d11_input_element_desc;

乙個輸入布局使用乙個型別為id3d11inputlayout物件 輸入布局呼叫direct3d裝置函式:

通過createinputlayout所建立:

hresult createinputlayout(

const d3d11_input_element_desc* pinputelement descs,

uint numelements,

const void* pshaderbytecodewithinputsignature,

size_t bytecodelength,

id3d11inputlayout** ppinputlayout

)

第乙個引數是頂點元素的陣列

第二個是陣列元素數量

第三個是有輸入標識的已經編譯的頂點著色器**

第四個是著色器字碼的尺寸

最後乙個是該函式所要建立的物件指標

頂點著色器**的編譯:

hresult winapi d3dx11compilefromfilea(lpcstr psrcfile,  //hlsl著色器**的編譯路徑

const d3d10_shader_macro* pdefines, //著色器**中的全域性巨集,在應用程式內定義巨集

lpd3d10include pinclude, //著色器**原始檔中開啟或關閉檔案

lpcstr pfunctionname, //編譯器入口函式名

lpcstr pprofile, //著色器模型

uint flags1, //編譯標識1

uint flags2, //編譯標識2

id3dx11threadpump* ppump, //pump指標 專門處理多執行緒

id3d10blob** ppshader, //編譯完成後節碼的記憶體位址

id3d10blob** pperrormsgs, //產生錯誤資訊的記憶體位址

hresult* phresult); //pump的返回值

頂點元素的布局

輸入的布局使用createinputlayout完成

//實現頂點布局

d3d11_input_element_desc vertexlayout =

}; unsigned int totallayoutelements = arraysize(vertexlayout);

result = d3ddevice_->createinputlayout(vertexlayout, totallayoutelements, vsbuffer->getbufferpointer(), vsbuffer->getbuffersize(), &inputlayout);

vsbuffer->release();

if (failed(result))

//載入畫素著色器

id3dblob* psbuffer = 0;

id3dblob* errorbuffer = 0;

result = d3dx11compilefromfile("sampleshader.fx", 0, 0, "ps_main", "ps_4_0", shaderflag, 0, 0, &psbuffer, &errorbuffer, 0);

if (failed(result))

return;

} if (errorbuffer != 0)

errorbuffer->release();

result = d3ddevice_->createpixelshader(psbuffer->getbufferpointer(), psbuffer->getbuffersize(), 0, &solidcolorps);

psbuffer->release();

if (failed(result))

共同特徵:

DirectX 學習筆記

1.呼叫drawprimitive 和 drawindexedprimitive 就相當於一次drawcall,所以如果我們要減少drawcall的數量,那麼就要盡量將資料塞到乙個buffer中然後再一次性提交,但是塞得資料是有一些限制的.限制如下 1 是否資料的頂點宣告格式是一樣的?2 是否使用的...

DirectX 渲染到紋理

熟悉dx的兄弟們都知道什麼叫紋理了,這裡簡單介紹一下,先看看現實生活中的例子吧,其實紋理的例子比比皆是,比如地板,牆面都是紋理。在圖形學中,紋理主要是為了增強場景的真實感,比如你想繪製乙個地面,簡單一點可以直接使用乙個矩形,稍微複雜一點可以用三角形網格,再複雜一點可以使用地面紋理,有了紋理以後真實感...

DirectX渲染狀態設定

1 設定著色模式 setrenderstate d3drs shademode,d3dshade falt 設定平面著色模式 setrenderstate d3drs shademode,d3dshade gouraud 設定格勞德著色模式 2 設定多邊形填充模式 setrenderstate d3...