我正在尝试以编程方式创建一个texture3d,但我并不真正理解它是如何完成的。纹理的每个切片都应该是子资源吗?这是我正在尝试做的,但它不起作用:
// Create texture3d
const int32 cWidth = 6;
const int32 cHeight = 7;
const int32 cDepth = 3;
D3D11_TEXTURE3D_DESC desc;
desc.Width = cWidth;
desc.Height = cHeight;
desc.MipLevels = 1;
desc.Depth = cDepth;
desc.Format = DXGI_FORMAT_R32G32B32A32_FLOAT;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_RENDER_TARGET;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
const uint32 bytesPerPixel = 4;
uint32 sliceSize = cWidth*cHeight*bytesPerPixel;
float tex3d[cWidth*cHeight*cDepth];
memset(tex3d, 0x00, sizeof(tex3d));
uint32 colorIndex = 0;
for (uint32 depthCount = 0; depthCount<depthSize; depthCount++)
{
for (uint32 ii=0; ii<cHeight; ii++)
{
for (uint32 jj=0; jj<cWidth; jj++)
{
// Add some dummy color
tex3d[colorIndex++] = 1.f;
tex3d[colorIndex++] = 0.f;
tex3d[colorIndex++] = 1.f;
tex3d[colorIndex++] = 0.f;
}
}
}
D3D11_SUBRESOURCE_DATA initData[cDepth] = {0};
uint8 *pMem = (uint8*)tex3d;
// What do I pass here? Each slice?
for (uint32 depthCount = 0; depthCount<depthSize; depthCount++)
{
initData[depthCount].pSysMem = static_cast<const void*>(pMem);
initData[depthCount].SysMemPitch = static_cast<UINT>(sliceSize); // not sure
initData[depthCount].SysMemSlicePitch = static_cast<UINT>(sliceSize); // not sure
pMem += sliceSize;
}
ID3D11Texture3D* tex = nullptr;
hr = m_d3dDevice->CreateTexture3D(&desc, &initData[0], &tex);
ID3D11RenderTargetView *pRTV = nullptr;
hr = m_d3dDevice->CreateRenderTargetView(tex, nullptr, &pRTV);
这会创建纹理,但是当我给我 1 个子资源时?应该是3吗?
我看了这篇文章,但它指的是texture2d;
D3D11: Creating a cube map from 6 images
如果有人有一些有效的代码片段,我想看一下。
谢谢!
最佳答案
在 Direct3D 中,3D 纹理的布局使得子资源是 mipmap 级别。每个 mipmap 级别包含的切片数量是前一个级别的 1/2,但在这种情况下,您只有 1 个 mipmap LOD,因此您将只有 1 个子资源(包含 3 个切片)。
对于间距,SysMemPitch
是每个图像切片中行之间的字节数(cWidth * bytesPerPixel
假设你紧紧地包裹着这个)。 SysMemSlicePitch
是 2D 切片 之间的字节数 (cWidth * cHeight * bytesPerPixel
)。因此,每个 mipmap 的内存需要排列为一系列具有相同尺寸的 2D 图像。
关于directx-11 - 如何以编程方式创建纹理 3D?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23767432/