Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DX11以编程方式填充3D纹理_C++_Textures_Memcpy_Directx 11 - Fatal编程技术网

C++ DX11以编程方式填充3D纹理

C++ DX11以编程方式填充3D纹理,c++,textures,memcpy,directx-11,C++,Textures,Memcpy,Directx 11,我正在尝试使用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

我正在尝试使用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);
D3D11_-MAPPED_子资源mappedTex;
结果=p_上下文->映射(m_体素,0,D3D11_映射,0,D3D11_写入,0,&mappedTex);
float*pVoxels=(float*)mappedTex.pData;
//深度节距*33+行节距*33+33;
浮点*像素=(浮点*)malloc(287265*4);
对于(UINT dep=0;dep取消映射(m_体素,0);
自由((空*)像素);
使用此方法,纹理中的某些数据是精细的,但其他数据则完全错误。有人能解释一下使用这些指针和音高的正确方法来逐步通过纹理并初始化它吗


参考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;
    }
}
UINT depStart=mappedTex.DepthPitch/4*dep;
对于(UINT行=0;行
好吧,我终于明白我做错了什么。我必须将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;
    }
}
UINT depStart=mappedTex.DepthPitch/4*dep;
对于(UINT行=0;行