DX11以编程方式填充3D纹理
问题描述:
我试图用MSDN上提到的映射,写入和取消映射方法填充任意数据(-1或1)的3D纹理,但我一直无法找到如何做到这一点,使用行和深度沥青等DX11以编程方式填充3D纹理
质地说明任何实际的代码示例:
D3D11_TEXTURE3D_DESC m_3DTexDesc;
m_3DTexDesc.Height = 33;
m_3DTexDesc.Width = 33;
m_3DTexDesc.Depth = 33;
m_3DTexDesc.MipLevels = 1;
m_3DTexDesc.Format = DXGI_FORMAT_R32_FLOAT;
m_3DTexDesc.Usage = D3D11_USAGE_DYNAMIC;
m_3DTexDesc.BindFlags = D3D10_BIND_SHADER_RESOURCE;
m_3DTexDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
m_3DTexDesc.MiscFlags = 0;
result = p_device->CreateTexture3D(&m_3DTexDesc, NULL, &m_voxels);
我使用填补了纹理的代码是:
D3D11_MAPPED_SUBRESOURCE mappedTex;
result = p_context->Map(m_voxels, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedTex);
float* pVoxels = (float*)mappedTex.pData;
// DepthPitch * 33 + RowPitch * 33 + 33;
float* pTexels = (float*)malloc(287265*4);
for(UINT dep = 0; dep < m_3DTexDesc.Depth; dep++)
{
UINT depStart = mappedTex.DepthPitch*dep;
for(UINT row = 0; row < m_3DTexDesc.Width; row++)
{
UINT rowStart = mappedTex.RowPitch*row;
for(UINT col = 0; col < m_3DTexDesc.Height; col++)
{
if(pos.y + col < 0.0f) pTexels[depStart + rowStart + col] = -1.0f;
else pTexels[depStart + rowStart + col] = 1.0f;
}
}
}
memcpy(pVoxels, (void*)pTexels, 287265);
p_context->Unmap(m_voxels, 0);
free((void*)pTexels);
我们在这种方法中,纹理中的一些数据没有问题,但其余的数据却大错特错。有人可以解释正确的方法来使用这些指针和间距来逐步通过纹理并初始化它吗?
仅供参考DepthPitch = 8448和RowPitch = 256
答
好吧,我终于摸索出我在做什么错。我不得不将rowStart和depStart除以4以将字节转换为浮点,并且固定了所有内容。
UINT depStart = mappedTex.DepthPitch/4*dep;
for(UINT row = 0; row < m_3DTexDesc.Width; row++)
{
UINT rowStart = mappedTex.RowPitch/4*row;
for(UINT col = 0; col < m_3DTexDesc.Height; col++)
{
if(pos.y + col < 0.0f) pTexels[depStart + rowStart + col] = -1.0f;
else pTexels[depStart + rowStart + col] = 1.0f;
}
}