如何以编程方式创建纹理?

时间:2014-05-20 18:35:28

标签: 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);

这会创建纹理但是当我给我一个子资源时?应该是3?

我看了这篇文章,但它指的是texture2d;

D3D11: Creating a cube map from 6 images

如果有人剪断了有效的代码,我想看一看。

THX!

1 个答案:

答案 0 :(得分:1)

在Direct3D中,布局3D纹理,使得子资源是mipmap级别。每个mipmap级别包含1/2的切片,但在这种情况下,您只有1个mipmap LOD,因此您只有1个子资源(包含3个切片)。

对于音高,SysMemPitch是每个图像切片中的 之间的字节数(cWidth * bytesPerPixel,假设您紧紧包装) 。 SysMemSlicePitch是2D 切片 cWidth * cHeight * bytesPerPixel)之间的字节数。因此,每个mipmap的存储器需要被安排为一系列具有相同尺寸的2D图像。