DrectX11學習筆記之Texture2D相關

/////////////////////////////////////////////////////////////////////////////////////ui

有時候....有時候....咱們不是輸在大局上而是敗在細節上......Fight>>Fight>>Fight大笑spa

/////////////////////////////////////////////////////////////////////////////////////code



  HRESULT CTex_DX11::LoadTex(const TP_BOX *pDstBox, const void *pSrcData, 
     UINT SrcRowPitch, UINT SrcDepthPitch)其中參數UINT SrcRowPitch真正含義沒搞清楚,結果耽誤了很久時間,下邊對其進行解釋說明:
orm

在SDK中對參數UINT SrcRowPitch解釋爲:it

The pitch, or width, or physical size (in bytes), of one row of an uncompressed texture.table


當對一個ID3D11Texture2D進行Map操做時,會遇到D3D11_MAPPED_TEXTURE2D結構。該結構有一個屬性是UINT RowPitch,若是沒有很好的理解這個屬性的含義,Map操做的結果頗有多是不對的。class

一個普通texture一行的字節總數就是它的RowPitch。但要特別注意的是:RowPitch並不就等於Texture2D的width乘以其每一個紋元(texel)的字節數,即:sed

RowPitch ≠ width* sizeof (pixelFormat)im

RowPitch老是大於等於後者,而且通常是等於一個2的n次冪。從上面也能夠看出Pitch是以字節爲單位,而width是以像素爲單位的。img

舉例說明:

一個ID3D11Texture2D,建立它時所使用的D3D10_TEXTURE2D_DESC結構的Format屬性是DXGI_FORMAT_R32G32B32A32_FLOAT,即一個紋元佔16(4×4)個字節,Width屬性是400,即每一行有400個紋元,則可計算每一行16 * 400 = 6400bytes。但若是對Texture2D進行Map操做時,能夠發現,Map後所獲得的D3D10_MAPPED_TEXTURE2D結構的RowPitch的值倒是8192(是大於6400的最小的2的n次冪)。

因此在進行Map操做時,須要針對RowPitch,而不要依賴定義texture時的width。

可是,在fx文件中對紋理進行採樣的時候,針對的則是width,見以下fx代碼。其中offset是相對於起點的偏移量,g_TexWidth是一個二維紋理的width,可見爲了得到offset在紋理中的uv座標,計算都是相對於width的,這時不用考慮pitch。



uint baseU = offset % g_TexWidth;

uint baseV = offset / g_TexWidth;



相關文章
相關標籤/搜索