我正在尝试以编程方式创建一个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);
这会创建纹理但是当我给我一个子资源时?应该是3?
我看了这篇文章,但它指的是texture2d;
D3D11: Creating a cube map from 6 images
如果有人剪断了有效的代码,我想看一看。
THX!
答案 0 :(得分:1)
在Direct3D中,布局3D纹理,使得子资源是mipmap级别。每个mipmap级别包含1/2的切片,但在这种情况下,您只有1个mipmap LOD,因此您只有1个子资源(包含3个切片)。
对于音高,SysMemPitch
是每个图像切片中的 行 之间的字节数(cWidth * bytesPerPixel
,假设您紧紧包装) 。 SysMemSlicePitch
是2D 切片 (cWidth * cHeight * bytesPerPixel
)之间的字节数。因此,每个mipmap的存储器需要被安排为一系列具有相同尺寸的2D图像。