在DirectX 11中创建1D纹理

时间:2014-11-20 22:01:17

标签: directx

我尝试使用此代码在DirectX 11中创建1D纹理:

PARAMETER:ID3D11Device * pDevice

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 = 1text1_desc.ArraySize = 1一切都很好。

text1_desc.MipLevels = 0text1_desc.MipLevels > 1在0x000007FEE6D14CC0(nvwgf2umx.dll)处引发未处理的异常时:0xC0000005:访问冲突读取位置0xFFFFFFFFFFFFFFFF。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 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纹理的代码。