2012-09-12 84 views
0

DirectX11的映射頂點顯然我有一個關於映射vertexBuffers到使用的memcpy不使用的memcpy

GPU的一些問題,這是我最初的代碼

D3D11_MAPPED_SUBRESOURCE MappedResource; 
    ID3D11Buffer *pBuffer = s_vertexBuffers.pBuffers[i].Get(); 
    HRESULT hr = s_d3dContext->Map(pBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &MappedResource); 

    float *vertices = (float *) MappedResource.pData, 
     *data = (float *)s_vertexBuffers.pData[i]; 
    int len = s_vertexBuffers.pStrides[i]; 
    if (i != VERTEX_BUFFER::COLOR) 
    { 
     len *= total; 
    } 

    memcpy(vertices, data, len); 
    s_d3dContext->Unmap(pBuffer, 0); 

什麼我要改變的是映射的方式(將數據從緩衝區複製到GPU中)使用指針(如指向here的指針)轉換爲類似於SetShaderParameters函數(也在本教程中),該指針使用指針獲取緩衝區中的數據並直接使用指針將數據複製到其中

基本上,行 float * vertices =(float *)MappedResource.pData 直到 memcpy(vertices,data,len);

將變爲像上面的教程中指出

這是我的代碼看起來像現在

VertexBuffers *dataPtr; 
dataPtr = (VertexBuffers *)MappedResource.pData; 
dataPtr->pBuffers[i] = s_vertexBuffers.pBuffers[i].Get(); 
dataPtr->pData[i] = s_vertexBuffers.pData[i]; 
dataPtr->pSizes[i] = s_vertexBuffers.pSizes[i]; 
dataPtr->pStrides[i] = s_vertexBuffers.pStrides[i]; 
if (i != VERTEX_BUFFER::COLOR) 
{ 
    dataPtr->pStrides[i] *= total; 
} 

結構VertexBuffers和VERTEX_BUFFER命名空間的內容是

namespace VERTEX_BUFFER 
{ 
    enum : int 
    { 
     POSITION, 
     COLOR, 
     TEXCOORD, 
     COUNT 
    }; 
} 


struct VertexBuffers 
    { 
     ComPtr<ID3D11Buffer> pBuffers[VERTEX_BUFFER::COUNT]; 
     void*     pData[VERTEX_BUFFER::COUNT]; 
     UINT     pStrides[VERTEX_BUFFER::COUNT]; 
     UINT     pSizes[VERTEX_BUFFER::COUNT]; 
    }; 

我認爲這個問題是每當我試圖使用指針複製數據時,我不會像memcpy一樣將len記入帳戶

由於我目前正在學習DirectX和編程,如果對我的解釋不太正確,請糾正我。

對不起,不好的代碼和糟糕的編程技巧,以及壞的英語,乾杯!

+0

很難理解你想要做什麼。也許如果你包含一個你正在關注的教程的鏈接,它會有所幫助。 – john

+0

http://www.rastertek.com/dx11tut05.html我將在提供的鏈接中將我的代碼轉換爲與SetShaderParameters函數類似的東西,謝謝! – nesto

回答

0

所以你想要這樣的東西?

VertexBuffers *dataPtr; 
dataPtr = (VertexBuffers *)MappedResource.pData; 
dataPtr->pBuffers[i] = s_vertexBuffers.pBuffers[i].Get(); 
dataPtr->pSizes[i] = s_vertexBuffers.pSizes[i]; 
dataPtr->pStrides[i] = s_vertexBuffers.pStrides[i]; 
if (i != VERTEX_BUFFER::COLOR) 
{ 
    dataPtr->pStrides[i] *= total; 
} 
memcpy(dataPtr->pData[i], s_vertexBuffers.pData[i], dataPtr->pStrides[i]); 

如你發現當你有兩個指針(說p和q),則所有p = q;做的就是複製指針。如果你想複製被指向的數據,你應該寫memcpy(p, q, size_of_data);

+0

沒有約翰,我想要做的就是直接將s_vertexBuffers中的數據導入到MappedResouce.pData中,而不使用memcpy,並且在複製它時考慮緩衝區的大小(pStrides),我期待並完全不使用memcpy :) – nesto

+0

@nesto對不起,我不知道。 – john

+0

@nesto您已經有效地詢問:「如何將數據複製到GPU,而不復制任何數據?」 –