簡體   English   中英

創建一個Texture2DArray並用實體值填充

[英]Creating a Texture2DArray and populate it with solid values

我在DirectX11中創建和填充Texture2DArray時遇到一些問題。

我想在屏幕上渲染許多四邊形,通過實例化完成繪制,但是每個四邊形都應具有自己的紋理。 因此,我嘗試創建一個紋理數組並將索引值添加到實例數據格式。

問題是,當我嘗試在數組中創建兩個不同的紋理時,當我嘗試使用以下錯誤調用函數CreateTexture2D時,它失敗了:

D3D11 ERROR: ID3D11Device::CreateTexture2D: pInitialData[4].SysMemPitch cannot be 0 [ STATE_CREATION ERROR #100: CREATETEXTURE2D_INVALIDINITIALDATA]
D3D11 ERROR: ID3D11Device::CreateTexture2D: pInitialData[6].pSysMem cannot be NULL. [ STATE_CREATION ERROR #100: CREATETEXTURE2D_INVALIDINITIALDATA]
D3D11 ERROR: ID3D11Device::CreateTexture2D: pInitialData[7].pSysMem cannot be NULL. [ STATE_CREATION ERROR #100: CREATETEXTURE2D_INVALIDINITIALDATA]
D3D11 ERROR: ID3D11Device::CreateTexture2D: Returning E_INVALIDARG, meaning invalid parameters were passed. [ STATE_CREATION ERROR #104: CREATETEXTURE2D_INVALIDARG_RETURN]

這是我用來生成紋理的代碼:

//Create array for two textures
const int size = 256 * 256 * 4;
unsigned char color[size*2];

//First Texture white
for (int i = 0; i < size; i++) {
    color[i] = 255;
}

//Second Texture black
for (int i = size; i < size*2; i++) {
    color[i] = 0;
}


//Creating Texture2D description
D3D11_TEXTURE2D_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_TEXTURE2D_DESC));
desc.Width = 256;
desc.Height = 256;
desc.MipLevels = 1;
desc.ArraySize = 2;
desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;

ID3D11Texture2D *pTexture;
D3D11_SUBRESOURCE_DATA texture[2];
//ZeroMemory(&texture, sizeof(D3D11_SUBRESOURCE_DATA));

//Defining the texture start points
texture[0].pSysMem = color;
texture[0].SysMemPitch = sizeof(unsigned char) * 4;
texture[0].SysMemSlicePitch = 0;
texture[1].pSysMem = &color[size];
texture[1].SysMemPitch = sizeof(unsigned char) * 4;
texture[1].SysMemSlicePitch = 0;
result = device->CreateTexture2D(&desc, texture, &pTexture);

我不知道為什么我在沒有定義點的數組位置處的錯誤狀態,我只有兩個大小的紋理數組。 也許我在初始化或填充數據時做錯了。

我希望有一個人可以幫助我。

好的,我現在修復了一些問題,對函數CreateTexture2D的調用返回了S_OK,但總是出現另一個問題。 函數CreateShaderResourceView也返回S_OK,但是結果是我的ShaderRessourceView數組的第一個索引有效,而第二個索引已損壞。

這里是固定代碼:

//Defining the texture start points
texture[0].pSysMem = black;
texture[0].SysMemPitch = sizeof(unsigned char) * 4;
texture[0].SysMemSlicePitch = 256 * 256 * 4;
texture[1].pSysMem = &black[size];
texture[1].SysMemPitch = sizeof(unsigned char) * 4;
texture[1].SysMemSlicePitch = 256*256 *4;
result = device->CreateTexture2D(&desc, texture, &pTexture);

和帶來問題的代碼:

D3D11_SHADER_RESOURCE_VIEW_DESC srDesc;
srDesc.Format = desc.Format;
srDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
srDesc.Texture2DArray.MostDetailedMip = 0;
srDesc.Texture2DArray.MipLevels = 1;
srDesc.Texture2DArray.ArraySize = 2;
srDesc.Texture2DArray.FirstArraySlice = 0;

ID3D11ShaderResourceView *pShaderResView[2];
result = device->CreateShaderResourceView(pTexture, &srDesc, pShaderResView);

調用PSSetShaderResources(0,2,pShaderResView)時,它將生成以下錯誤。

D3D11 CORRUPTION: ID3D11DeviceContext::PSSetShaderResources: Third parameter, array index 1 corrupt or unexpectedly NULL. [ MISCELLANEOUS CORRUPTION #15: CORRUPTED_PARAMETER3]

我希望我正確地初始化了Texture2D和Subressource_Data,我在理解SysMemPitch和SysMemSlicePitch時遇到了一些問題。

但是現在我不知道為什么第二個索引被破壞了。

CreateShaderResourceView僅初始化一個ID3D11ShaderResourceView *,您不應為其提供兩個指針的數組。

您已經創建了一個尺寸為256x256x2的紋理,並創建了一個可以查看兩個切片的SRV。 調用PSSetShaderResources時,只需設置一個SRV。

刪除第二個SRV,僅設置一個,因為您已經查看了兩個切片。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM