首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Directx11高程图纹理实时修改问题

Directx11高程图纹理实时修改问题
EN

Stack Overflow用户
提问于 2022-05-31 14:38:42
回答 1查看 32关注 0票数 0

我在做地形工具。我做了一个二维纹理,并使用它作为高度地图。我想改变高度图的一个特定部分,但我有一个问题。我改变了某些小部分,但整个景观的纹理都变了。我想知道这个问题的原因和如何解决。

谢谢。

`HeightMap创建代码

代码语言:javascript
复制
    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纹理修改代码

代码语言:javascript
复制
    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));

请参考右下角区域下面的图片,呈现HeightMap纹理。我只想编辑1/4的宽度和高度,但这一切都改变了。

在这里输入图像描述

当应用完整的高程图时,它正常工作。

在这里输入图像描述

EN

回答 1

Stack Overflow用户

发布于 2022-06-08 14:52:09

纹理在内存中的宽度和高度并不总是与定义所示的相同。一些纹理步幅(线条)过大。您必须使用步长*行来计算要写入的偏移量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72449794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档