用数据填充CubeTexture

时间:2015-06-25 21:42:21

标签: directx directx-11

我很困惑为什么这不起作用。

我试图将纹理数据添加到每个立方体纹理面。出于某种原因,只有第一个(+ x)​​有效。 MSDN文档非常稀疏,但看起来应该可以解决这个问题:

echo "$(document).ready(function() {
          $('#submit').click(function(){
              var n = $('#n').val();  
              jQuery.ajax({
                  type: 'GET',
                  url: 'function.php',
                  data: {n:n},
                  success: function(results){                      
                      alert(n)
                  }
              });
          });
      });";

在调试和查看面部时,除了第一个面部外,它的全部只是黑色,这似乎很好。所以很明显我做错了什么,你如何正确地将cubetexture数据上传到所有面孔?

编辑:按照用于创建纹理的参数:

// 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);
    }
}

然后在上传数据之后我生成如下的mip链:

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));

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

1 个答案:

答案 0 :(得分:0)

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

您对D3D11CalcSubresource的参数有第三个参数'1',表明只有一个mip,这似乎不是真的。确保将正确数量的mips传递给此辅助函数,否则它将无法计算正确的子资源索引。

您可以在创建纹理后调用GetDesc()来获取mip计数。