我很困惑为什么这不起作用。
我试图将纹理数据添加到每个立方体纹理面。出于某种原因,只有第一个(+ 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)面。
答案 0 :(得分:0)
您可以通过将纹理描述清零来创建具有“0”mip级别的纹理。零意味着“请使用完整的mip链”,这意味着超过1 mip(除非你的纹理是1x1)。
您对D3D11CalcSubresource的参数有第三个参数'1',表明只有一个mip,这似乎不是真的。确保将正确数量的mips传递给此辅助函数,否则它将无法计算正确的子资源索引。
您可以在创建纹理后调用GetDesc()来获取mip计数。