5

D3D11 で 6 つの画像からキューブ マップを作成するにはどうすればよいですか? 私が見つけたすべての例では、1 つの .dds のみを使用しています。具体的には、キューブ テクスチャの個々の面をアップロードするにはどうすればよいですか?

4

2 に答える 2

3

この質問は古く、すでに解決策があることは知っています。

ディスクから 6 つのテクスチャをロードし、それらをキューブマップとしてまとめるコード例を次に示します。

前提条件:

ID3D11ShaderResourceView* srv = 0;
ID3D11Resource* srcTex[6];

ShaderResourceView へのポインタと、ディスクからの 6 つのテクスチャで満たされた配列。右、左、上、下、前、後ろの順番で使っています。

// Each element in the texture array has the same format/dimensions.
D3D11_TEXTURE2D_DESC texElementDesc;
((ID3D11Texture2D*)srcTex[0])->GetDesc(&texElementDesc);

D3D11_TEXTURE2D_DESC texArrayDesc;
texArrayDesc.Width = texElementDesc.Width;
texArrayDesc.Height = texElementDesc.Height;
texArrayDesc.MipLevels = texElementDesc.MipLevels;
texArrayDesc.ArraySize = 6;
texArrayDesc.Format = texElementDesc.Format;
texArrayDesc.SampleDesc.Count = 1;
texArrayDesc.SampleDesc.Quality = 0;
texArrayDesc.Usage = D3D11_USAGE_DEFAULT;
texArrayDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
texArrayDesc.CPUAccessFlags = 0;
texArrayDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;

ID3D11Texture2D* texArray = 0;
if (FAILED(pd3dDevice->CreateTexture2D(&texArrayDesc, 0, &texArray)))
    return false;

// Copy individual texture elements into texture array.
ID3D11DeviceContext* pd3dContext;
pd3dDevice->GetImmediateContext(&pd3dContext);
D3D11_BOX sourceRegion;

//Here i copy the mip map levels of the textures
for (UINT x = 0; x < 6; x++)
{
    for (UINT mipLevel = 0; mipLevel < texArrayDesc.MipLevels; mipLevel++)
    {
        sourceRegion.left = 0;
        sourceRegion.right = (texArrayDesc.Width >> mipLevel);
        sourceRegion.top = 0;
        sourceRegion.bottom = (texArrayDesc.Height >> mipLevel);
        sourceRegion.front = 0;
        sourceRegion.back = 1;

        //test for overflow
        if (sourceRegion.bottom == 0 || sourceRegion.right == 0)
            break;

        pd3dContext->CopySubresourceRegion(texArray, D3D11CalcSubresource(mipLevel, x, texArrayDesc.MipLevels), 0, 0, 0, srcTex[x], mipLevel, &sourceRegion);
    }
}

// Create a resource view to the texture array.
D3D11_SHADER_RESOURCE_VIEW_DESC viewDesc;
viewDesc.Format = texArrayDesc.Format;
viewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
viewDesc.TextureCube.MostDetailedMip = 0;
viewDesc.TextureCube.MipLevels = texArrayDesc.MipLevels;

if (FAILED(pd3dDevice->CreateShaderResourceView(texArray, &viewDesc, &srv)))
    return false;

誰かがこの質問をもう一度読んだら、おそらくこれを試してください。警告: deviceContext を使用する必要があるため、この関数はスレッドセーフではありません。

于 2015-12-17T02:32:30.560 に答える