2015-06-25 73 views
0

我很困惑,为什么这不起作用。用数据填充立方体纹理

我试图将纹理数据添加到每个立方体纹理面。出于某种原因,只有第一个(+ x)​​的作品。 MSDN文档是相当稀少,但看起来这应该做的伎俩:

// mip-level 0 data 
// R8G8B8A8 texture 
uint32_t sizeWidth = textureWidth * sizeof(uint8_t) * 4; 
if (isCubeTexture) 
{ 
    for (uint32_t index = 0; index < gCubemapNumTextures; ++index) 
    { 
     const uint32_t subResourceID = D3D11CalcSubresource(0, index, 1); 
     context->UpdateSubresource(mTexture, subResourceID, NULL, &textureData.at(sizeWidth * textureHeight * index), sizeWidth, 0); 
    } 
} 

调试时,看着脸上的所有除第一面,这似乎负荷罚款只是黑色的。因此,我正在做错误的处理,您如何正确地上传cubetexture数据到所有的面孔?

编辑:遵循用于创建纹理参数:

D3D11_TEXTURE2D_DESC textureDesc; 
ZeroMemory(&textureDesc, sizeof(D3D11_TEXTURE2D_DESC)); 
textureDesc.Width = textureWidth; 
textureDesc.Height = textureHeight; 
textureDesc.ArraySize = isCubeTexture ? gCubemapNumTextures : 1; 
if (isSRGB) 
    textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; 
else 
    textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
textureDesc.SampleDesc.Count = 1; 
textureDesc.Usage = D3D11_USAGE_DEFAULT; 
textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE; 
textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS; 
if (isCubeTexture) 
    textureDesc.MiscFlags |= D3D11_RESOURCE_MISC_TEXTURECUBE; 
DXCALL(device->CreateTexture2D(&textureDesc, NULL, &mTexture)); 

然后将数据上传后,我产生的MIP链是这样的:

context->GenerateMips(mShaderResourceView); 

再次,它工作正常,但只适用于第一个(+ x)​​脸。

+0

你用来创建纹理的参数是什么? –

回答

0

您可以通过清零纹理描述来创建具有“0”mip级别的纹理。零意味着“完整的MIP链请”,这意味着超过1米(除非你的纹理是1x1)。

您对D3D11CalcSubresource的参数有第三个参数'1',表明只有一个mip,看起来并不正确。确保将正确数量的mips传递给此辅助函数,否则它将不计算正确的子资源索引。

您可以通过在创建纹理后调用GetDesc()来获得mip数。