directx-11 - 如何以编程方式创建纹理 3D?

标签 directx-11

我正在尝试以编程方式创建一个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/

相关文章:

directx-11 - DirectX11 交换链和窗口失去全屏状态

c++ - 错误 : ID3D11Texture2D is not defined.

c++ - 基本的 DirectX11 问题,只要我开始在屏幕上绘制任何东西,代码就会崩溃。还有助于 Netbeans 配置

windows - DirectX 11 视频播放

c++ - 如何从 Direct3D 11 中的 CPU 访问帧缓冲区?

directx-11 - 如何在 directX 11 中将 SHADEMODE 设置为 D3DSHADE_FLAT

c++ - 地形跟随算法中的负行和负列

c++ - 在 Qt 事件中中断

XMVectorPermute 的 C++ 模板相关错误

c++ - DXGI_OUTDUPL_DESC 的 DesktopImageInSystemMemory