DX11渲染管道 資料的修改 Map和Unmap

2021-09-01 14:45:02 字數 1588 閱讀 1796

在c++與hlsl繫結cbuffer資料的時候,非常容易出錯,出錯的根本原因是c++對資料結構記憶體的分配與hlsl不同。

重要:hlsl的結構體struct其實並不管你是乙個變數還是幾個變數,它就是按照一次放滿乙個float4的記憶體長度,多少變數都往乙個float4裡面塞,塞滿了再接著塞下乙個float4。測試結果顯示:cbuffer的長度必須是float4的整數倍才行,不知道float+float3的這種組合是否可以正常獲取資料,也不清楚float+float+float3+float3這種組合能不能正常分配到資料,關鍵取決於gpu的記憶體分配規則。

在進入渲染管道後,如果cpu出現了要修改buffer或者其它型別資料的時候,不可能重新new乙個buffer塞進去。這個時候需要一種機制能夠修改已經進入管道的資料,這種機制就是map和unmap機制。其本質就是對資料加鎖導致gpu不能修改,然後cpu對其進行修改,修改完後還原。

map:獲取的資料中包含乙個子資源的指標,並拒絕該子資源的訪問gpu。

hresult map(

id3d11resource *presource, // 需要修改的源,型別不是buffer,這說明map還可以修改狀態值。

uint subresource, // 子資源的位置

d3d11_map maptype, // 這是乙個列舉型別:d3d11_map_write_discard,d3d11_map_write_no_overwrite

uint mapflags, // 乙個可選標準,不懂

); void *pdata; // 傳說中我們可以修改的東東

uint rowpitch; // 對某一行的某個畫素

uint depthpitch; // 對應某一行,這兩個引數最好不用

unmap:無效的指標指向的資源,並重新啟用gpu的訪問該資源。

void unmap(

id3d11resource *presource,

uint subresource

);

例子:

// 得到const buffer指標.

// 設定transform矩陣.

d3dxmatrix worldmatrix;

d3dxmatrixidentity(&worldmatrix);

matrix4 transform = d3dxmatrix2matrix4(worldmatrix) * cameramanager->getview() * cameramanager->getperspective();//d3dxmatrix2matrix4(viewmatrix) cameramanager->getview()

dataptr->transform = transform.transpose(); // 矩陣需要轉置

m_immediatecontext->unmap(matrixbuffer, 0);

此文主要是想演示一下如何修改資源。

DX11渲染管道 著色器的編譯和建立

在不使用效果框架的時候,整個渲染管道其實挺簡單的,建立資源,輸入資源。編譯著色器輸入著色器,其實著色器本身也是一種資料,只不過這個資料描述的是邏輯。最後呼叫一下draw方法畫一下就ok 了。這裡說說著色器的編譯和建立,很簡單。d3dx11compilefromfile hresult d3dx11c...

DX11中渲染到紋理的資料儲存問題

以float格式儲存到紋理中時,rgba中的a值,如果儲存方式不當,可能會導致資料錯亂。問題是在體繪製實驗 現的。在渲染到紋理的ps shader中,使用如下 輸出座標值,其中output.vpos型別為float4。ps input output ps input 0 output.vpos.xy...

DX11細分的優勢和特點

花時間學習了下dx11下的細分,感覺細分好處還真多,不象以前想的,模型已經夠象了還需要什麼細分。現在回過頭來看看,細分用在下面有極大的優勢。1 大地形。像 鷹擊長空 這類使用大地形的遊戲,可以充分使用細分來更好地管理地形。可有人會說,增加頂點,會使系統效能下降,的確是這樣。但其優勢是細分距離攝影機近...