c++ 创建Texture2DArray并使用实体值填充它

yhived7q  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(196)

我在DirectX11中创建和填充Texture2DArray时遇到了一些问题。
我想在屏幕上渲染许多四边形,绘制是通过示例完成的,但每个四边形都应该得到自己的纹理。因此,我尝试创建一个纹理数组,并在示例数据格式中添加了一个索引值。
问题是,当我尝试在数组中创建两个不同的纹理时,当我尝试调用函数CreateTexture2D时,它失败了,错误如下:

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

下面是我用来生成纹理的代码:

  1. //Create array for two textures
  2. const int size = 256 * 256 * 4;
  3. unsigned char color[size*2];
  4. //First Texture white
  5. for (int i = 0; i < size; i++) {
  6. color[i] = 255;
  7. }
  8. //Second Texture black
  9. for (int i = size; i < size*2; i++) {
  10. color[i] = 0;
  11. }
  12. //Creating Texture2D description
  13. D3D11_TEXTURE2D_DESC desc;
  14. ZeroMemory(&desc, sizeof(D3D11_TEXTURE2D_DESC));
  15. desc.Width = 256;
  16. desc.Height = 256;
  17. desc.MipLevels = 1;
  18. desc.ArraySize = 2;
  19. desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
  20. desc.SampleDesc.Count = 1;
  21. desc.SampleDesc.Quality = 0;
  22. desc.Usage = D3D11_USAGE_DEFAULT;
  23. desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
  24. desc.CPUAccessFlags = 0;
  25. desc.MiscFlags = 0;
  26. ID3D11Texture2D *pTexture;
  27. D3D11_SUBRESOURCE_DATA texture[2];
  28. //ZeroMemory(&texture, sizeof(D3D11_SUBRESOURCE_DATA));
  29. //Defining the texture start points
  30. texture[0].pSysMem = color;
  31. texture[0].SysMemPitch = sizeof(unsigned char) * 4;
  32. texture[0].SysMemSlicePitch = 0;
  33. texture[1].pSysMem = &color[size];
  34. texture[1].SysMemPitch = sizeof(unsigned char) * 4;
  35. texture[1].SysMemSlicePitch = 0;
  36. result = device->CreateTexture2D(&desc, texture, &pTexture);

我不知道为什么在数组位置的错误状态,我没有在任何点定义,我只有一个两个大小的纹理数组。也许我在初始化或填充数据时出错了。
我希望有人能帮助我。

j0pj023g

j0pj023g1#

好的,我修复了一些现在函数CreateTexture 2D的调用返回S_OK,但总是发生另一个问题。函数CreateShaderResourceView也返回S_OK,但结果是ShaderRessourceView数组的第一个索引有效,第二个索引已损坏。
这里是固定代码:

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

以及带来问题的代码:

  1. D3D11_SHADER_RESOURCE_VIEW_DESC srDesc;
  2. srDesc.Format = desc.Format;
  3. srDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
  4. srDesc.Texture2DArray.MostDetailedMip = 0;
  5. srDesc.Texture2DArray.MipLevels = 1;
  6. srDesc.Texture2DArray.ArraySize = 2;
  7. srDesc.Texture2DArray.FirstArraySlice = 0;
  8. ID3D11ShaderResourceView *pShaderResView[2];
  9. result = device->CreateShaderResourceView(pTexture, &srDesc, pShaderResView);

调用PSSetShaderResources(0,2,pShaderResView)时产生以下错误;

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

我希望我初始化Texture 2D和Subresource_Data正确,我有一些问题理解SysMemPitch和SysMemSlicePitch。
但是现在我不知道为什么第二个索引被损坏了。

展开查看全部
xhv8bpkk

xhv8bpkk2#

CreateShaderResourceView只初始化一个ID3D11ShaderResourceView*,你不应该给它一个两个指针的数组。
您已经创建了一个尺寸为256x256x2的纹理,并创建了一个查看两个切片的SRV。当您调用PSSetShaderResources时,只需要设置一个SRV。
删除第二个SRV,只设置一个,因为您已经看到了两个切片。

相关问题