简体   繁体   中英

Directx11 heightmap texture real-time modification problem

I'm making a terrain tool. I made a 2D texture and am using it as a height map. I want to change a specific part of the heightmap, but I'm having a problem. I changed certain small parts, but the whole landscape of the texture is changed. I would like to know the cause of this problem and how to solve it

thank you.

`HeightMap ShaderResourceView Create Code


    void TerrainRenderer::BuildHeightmapSRV(ID3D11Device* device)
    {
        ReleaseCOM(mHeightMapSRV);
        ReleaseCOM(m_hmapTex);
    
        D3D11_TEXTURE2D_DESC texDesc;
        texDesc.Width = m_terrainData.HeightmapWidth; //basic value 2049
        texDesc.Height = m_terrainData.HeightmapHeight; //basic value 2049
        texDesc.MipLevels = 1;
        texDesc.ArraySize = 1;
        texDesc.Format = DXGI_FORMAT_R16_FLOAT;
        texDesc.SampleDesc.Count = 1;
        texDesc.SampleDesc.Quality = 0;
        texDesc.Usage = D3D11_USAGE_DYNAMIC;
        texDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
        texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
        texDesc.MiscFlags = 0;
    
        // HALF is defined in xnamath.h, for storing 16-bit float.
        std::vector<HALF> hmap(mHeightmap.size());
        //current mHeightmap is all zero.
        std::transform(mHeightmap.begin(), mHeightmap.end(), hmap.begin(), XMConvertFloatToHalf);
    
        D3D11_SUBRESOURCE_DATA data;
        data.pSysMem = &hmap[0];
        data.SysMemPitch = m_terrainData.HeightmapWidth * sizeof(HALF);
        data.SysMemSlicePitch = 0;
            
        HR(device->CreateTexture2D(&texDesc, &data, &m_hmapTex));
    
        D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc;
        srvDesc.Format = texDesc.Format;
        srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
        srvDesc.Texture2D.MostDetailedMip = 0;
        srvDesc.Texture2D.MipLevels = -1;
        
        HR(device->CreateShaderResourceView(m_hmapTex, &srvDesc, &mHeightMapSRV));
            
    }

`HeightMap Texture modifying code


    D3D11_MAPPED_SUBRESOURCE mappedData;
        //m_hmapTex is ID3D11Texture2D*
        HR(m_texMgr.m_context->Map(m_hmapTex, D3D11CalcSubresource(0, 0, 1), D3D11_MAP_WRITE_DISCARD, 0, &mappedData));
        HALF* heightMapData = reinterpret_cast<HALF*>(mappedData.pData);
        D3D11_TEXTURE2D_DESC heightmapDesc;
        m_hmapTex->GetDesc(&heightmapDesc);
        UINT width = heightmapDesc.Width;
    
        for (int row = 0; row < width/4; ++row)
        {
            for (int col = 0; col < width/4; ++col)
            {
                idx = (row * width) + col;
                heightMapData[idx] = static_cast<HALF>(XMConvertFloatToHalf(200));
            }
        }
        
        m_texMgr.m_context->Unmap(m_hmapTex, D3D11CalcSubresource(0,0,1));

Please refer to the picture below The lower right area renders the HeightMap texture. I wanted to edit only 1/4 width and height, but that's all changed.

enter image description here

When the completed heightmap is applied, it works normally.

enter image description here

A texture does not always have the same width and height in memory as the definition suggests. Some textures strides (lines) are oversized. You have to use the Stride Size * Row to calculate the offset to write into.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM