创建一个Texture2DArray并填充实值
Creating a Texture2DArray and populate it with solid values
我在DirectX11中创建和填充texture2array时遇到了一些问题。
我想渲染许多四边形到屏幕上,绘图是通过实例化完成的,但每个四边形都应该有自己的纹理。所以我尝试创建一个纹理数组,并为实例数据格式添加一个索引值。
问题是,当我尝试在数组中创建两种不同的纹理时,当我尝试调用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);
我不知道为什么在数组位置的错误状态我没有定义,我只有两个大小的纹理数组。也许我在初始化或填充数据时做错了什么。
我希望有人能帮助我。
Ok,我现在修复了一些函数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并只设置一个,因为您已经查看了两个片。
- 在c++中用vector填充一个简单的动态数组
- 如何使用用户输入在C++中正确填充2D数组
- 如何找到大小'x'数组是否完全填充,在C++?
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- 通过for循环使用用户输入填充列表
- 根据用户输入用字母填充矢量,并将"开始"和"结束"放在四肢
- 如何正确填充在堆上分配的二维数组?
- 将数字转换为填充字符串
- 有没有办法在一行中填充矢量图
- 用C++中的数字和条件填充向量
- 用真值填充矢量
- 使用结构成员指针在C++中填充结构
- 流填充字符的默认定位
- 使用不同算法的 PKCS1v15 填充进行加密 ++ 签名
- C++:使用缓冲区中的数据填充结构
- 如何将零填充的多维数组传递给 C++ 中的函数?
- Cryptopp:获取密码输入的填充字符串
- 填充上编译器生成的复制构造函数之间的不一致
- RcppEigen 模板化函数,用于填充单位法线
- 我想生成许多矩阵并用随机数填充它