C++ 使用BMP作为高度贴图。如何访问像素颜色设置高度?
因此,我尝试使用bmp创建一些简单的地形,但我不知道如何访问像素颜色,以获得用作高度的RGB值。我理解这个概念,只是不知道如何把它付诸实践。这是我目前掌握的代码。非常感谢您的帮助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
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;
};