C++ 使用BMP作为高度贴图。如何访问像素颜色设置高度?

C++ 使用BMP作为高度贴图。如何访问像素颜色设置高度?,c++,directx-9,C++,Directx 9,因此,我尝试使用bmp创建一些简单的地形,但我不知道如何访问像素颜色,以获得用作高度的RGB值。我理解这个概念,只是不知道如何把它付诸实践。这是我目前掌握的代码。非常感谢您的帮助 CUSTOMVERTEX vecArray[256][256]; m_pSurface = nullptr; D3DXIMAGE_INFO imageInfo; ZeroMemory(&imageInfo, sizeof(D3DXIMAGE_INFO)); HRESULT hr = D3DXGetImage

因此,我尝试使用bmp创建一些简单的地形,但我不知道如何访问像素颜色,以获得用作高度的RGB值。我理解这个概念,只是不知道如何把它付诸实践。这是我目前掌握的代码。非常感谢您的帮助

CUSTOMVERTEX vecArray[256][256];

m_pSurface = nullptr;
D3DXIMAGE_INFO imageInfo;
ZeroMemory(&imageInfo, sizeof(D3DXIMAGE_INFO));

HRESULT hr = D3DXGetImageInfoFromFile(L"heightmap.bmp", &imageInfo);

_pDevice->CreateOffscreenPlainSurface(imageInfo.Width, imageInfo.Height, D3DFMT_X8R8G8B8, D3DPOOL_SCRATCH, &m_pSurface, 0);

hr = D3DXLoadSurfaceFromFile(m_pSurface, 0, 0, L"heightmap.bmp", 0, D3DX_FILTER_NONE, 0, &imageInfo);

D3DLOCKED_RECT lockRect;
ZeroMemory(&lockRect, sizeof(D3DLOCKED_RECT));

m_pSurface->LockRect(&lockRect, 0, D3DLOCK_READONLY);

int iNumPixels = imageInfo.Width * imageInfo.Height;
int iPixelsWidth = imageInfo.Width;
int iPixelsHeight = imageInfo.Height;

for (int i = 0; i < iPixelsWidth; ++i)          // HORIZONTAL ROWS
{
    for (int j = 0; j < iPixelsHeight; ++j)     // VERTICAL ROWS
    {
        vecArray[i][j].x = (float)i;
        vecArray[i][j].y = (float)j;

        vecArray[i][j].z = ???? // Get Height from bmp

        vecArray[i][j].color =  D3DCOLOR_XRGB(255, 255, 255);
    }
}

m_pSurface->UnlockRect();

将像素映射到缓冲区后,将颜色值作为整数(范围0到255)插值到高度范围。如果使用的是3通道图像(rgb),则需要首先将通道平均为一个值(即(r+g+b)/3)。这将为像素提供单个值


请参见“线性插值”将像素范围转换为高度范围。如果您询问如何访问像素值本身,这取决于加载位图的方法。

我10多年前看到的所有旧“演示”都使用带托盘的8位位图。托盘被丢弃,留下一个8位数字的数组,为您提供256个不同的高度级别。这是一个关于24位BMP和directX的页面。我正在尝试从高度图创建地形。我已将bmp加载到曲面上,如代码中所示。我想问的是,我如何访问特定像素上的数据,以获得其颜色,从而可以将其用作高度。然后,我可以创建缓冲区。如果已经将其加载到曲面,请使用LockRect()获取指向像素缓冲区的指针。我不确定DirectX是如何工作的,但您可能希望避免为高度贴图加载到曲面,因为曲面被指定为纹理。还有其他方法可以在DirectX之外加载DIB的像素数据。DIB是windows bmp格式。这是一种相对简单的格式。我有一些DIB加载代码,可以将DIB bmp加载到缓冲区中。如果您想要上述代码的副本,请给我发电子邮件ido。somecoding@gmail.com
struct CUSTOMVERTEX
{
    FLOAT x, y, z;  // The untransformed, 3D position for the vertex
    DWORD color;
};