話說這兩天我寫程式遇到乙個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...