D3D11之快取更新 update buffer

2021-07-23 10:31:48 字數 2266 閱讀 2541

話說這兩天我寫程式遇到乙個bug,是關於如何建立的id3d11buffer的應該以一種怎樣的方式在每幀渲染進行快取資源的更新

我總結為下:

//填充(頂點)快取形容結構體和子資源資料結構體,並建立頂點快取(這裡用的是動態快取)

d3d11_buffer_desc vertexbufferdesc;

vertexbufferdesc.usage = d3d11_usage_dynamic;

vertexbufferdesc.bytewidth = sizeof(vertex) * mvertexcount;

vertexbufferdesc.bindflags = d3d11_bind_vertex_buffer;

vertexbufferdesc.cpuaccessflags = d3d11_cpu_access_write;

vertexbufferdesc.miscflags = 0;

vertexbufferdesc.structurebytestride = 0;

這裡此時每幀進行該快取資源的更新應該用map和umap進行資源更新

vertexbufferdesc.usage = d3d11_usage_dynamic;

vertexbufferdesc.cpuaccessflags = d3d11_cpu_access_write;

//鎖定頂點快取為了可以進行寫入(動態快取不能用updatesubresources寫入)

//獲取指向頂點快取的指標

vertex* verticesptr;

//把資料複製進頂點快取

memcpy(verticesptr, (void*)vertexs, (sizeof(vertex) * mvertexcount));

//解鎖頂點快取

d3ddevicecontext->unmap(md3dvertexbuffer, 0);

//,設定(常量)快取形容結構體,並建立常量快取

d3d11_buffer_desc matrixbufferdesc;

zeromemory(&matrixbufferdesc, sizeof(matrixbufferdesc));

matrixbufferdesc.usage =d3d11_usage_default; //快取

matrixbufferdesc.bytewidth = sizeof(cbmatrix); //結構體大小,必須為16位元組倍數

matrixbufferdesc.bindflags = d3d11_bind_constant_buffer;

matrixbufferdesc.cpuaccessflags = 0; //cpu訪問寫

matrixbufferdesc.miscflags = 0;

matrixbufferdesc.structurebytestride = 0;

hr(d3ddevice->createbuffer(&matrixbufferdesc, null, &mcbmatrixbuffer));

這裡 matrixbufferdesc.usage =d3d11_usage_default; //快取

matrixbufferdesc.cpuaccessflags = 0; //cpu訪問寫

cbmatrix cb;

xmmatrix worldma = xmmatrixtranspose(worldmatrix);

xmmatrix viewma = xmmatrixtranspose(viewmatrix);

xmmatrix projma = xmmatrixtranspose(projmatrix);

cb.mworldmatrix = worldma;

cb.mviewmatrix = viewma;

cb.mprojmatrix = projma;

d3ddevicecontext->updatesubresource(mcbmatrixbuffer, 0, null, &cb, 0, 0);

//上面建立buffer設定的標誌位不一樣,更新資源的方式也不一樣,如果不按指定方式更新資源將會造成資源無法寫入快取的後果

更具體的等我水平提高研究過在補充後續內容,更新每幀動態變化的盡量還是用map和umap吧

D3D 9和D3D 11繪製流水線對比

繪製流水線 pipline 是圖形學程式設計中屬於各種圖形學框架的骨架。windows平台下3d遊戲開發幾乎都會用到d3d來進行遊戲引擎的設計。d3d 9是使用比較廣泛的乙個版本,d3d 9 中比較核心的就是固定渲染管線 fixed function pipline 下圖是從官方的sdk中翻譯的,從...

D3D11遊戲程式設計 學習筆記六 定時器的實現

注 謝謝 這個定時器支援暫時 開始 重置等基本操作,程式中每一幀呼叫一次計數,並隨時返回距離上一次計數之間的差值。這個差值就是控制遊戲 動畫更新的最重要的資料。這個定時器用到了windows中高精度的計時函式 queryperformancecounter和queryperformancefrequ...

D3D11計算著色器程式Bug修改記錄(不斷更新)

最近一段時間用計算著色器完成一些影象處理的任務,遇到了不少bug,因為用cs做影象處理的資料較少,很多問題都是通過自己不斷定位,嘗試解決的。有些問題可能對別人有些參考,所以記錄一下,隨時更新。計算著色器的計算是很快的,但是我的程式在測試的時候,會有幾十ms的延時。並且奇怪的是,同樣的電腦,vs201...