我尝试使用此代码在DirectX 11中创建1D纹理:
D3D11_TEXTURE1D_DESC text1_desc;
::ZeroMemory(&text1_desc, sizeof(D3D11_TEXTURE1D_DESC));
text1_desc.Width = 258
text1_desc.MipLevels = 2;
text1_desc.ArraySize = 2;
text1_desc.Usage = D3D11_USAGE_IMMUTABLE;
text1_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
text1_desc.Format = R8G8B8A8_UNORM;
FLOAT* pData = new FLOAT[text1_desc.MipLevels * text1_desc.ArraySize * text1_desc.Width];
D3D11_SUBRESOURCE_DATA sr_data;
::ZeroMemory(&sr_data, sizeof(D3D11_SUBRESOURCE_DATA));
sr_data.pSysMem = pData;
ID3D11Texture1D* pTexture1D = nullptr;
auto hr = pDevice->CreateTexture1D(&text1_desc, &sr_data, &pTexture1D);
text1_desc.MipLevels = 1
和text1_desc.ArraySize = 1
一切都很好。
当text1_desc.MipLevels = 0
或text1_desc.MipLevels > 1
在0x000007FEE6D14CC0(nvwgf2umx.dll)处引发未处理的异常时:0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
“0”的Mip级别是一个问题,因为它导致分配大小为“0”。您需要计算出为给定输入宽度生成的mip级别数。所以对于0,你需要像:
size_t mipLevels = 1;
size_t width = 258;
while ( width > 1 )
{
if ( width > 1 )
width >>= 1;
++mipLevels;
}
要注意的第二件事是,如果要创建复杂资源,则必须传递D3D11_SUBRESOURE_DATA
个实例的数组,而不仅仅是一个实例。每个子资源只有一个D3D11_SUBRESOURE_DATA
,其长度必须为mipLevels * text1_desc.ArraySize
。您只需分配1,这就是您遇到运行时故障的原因。
您应该查看DirectXTex以获取适用于各种Direct3D 11纹理的代码。