簡體   English   中英

DX11以編程方式填充3D紋理

[英]DX11 Programmatically filling a 3D Texture

我正在嘗試使用MSDN上提到的map,write和unmap方法用任意數據(-1或1)填充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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM