2013-10-29 28 views
0

所以我试图用bmp创建一些简单的地形,我不知道如何访问像素颜色来获取它的RGB值作为高度。我理解这个概念,而不是如何将其付诸实践。这是迄今为止的代码。很感谢任何形式的帮助!使用BMP作为高度图。如何访问像素颜色来设置高度?

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(); 

的结构是定义为:

struct CUSTOMVERTEX 
{ 
    FLOAT x, y, z; // The untransformed, 3D position for the vertex 
    DWORD color; 
}; 
+0

从10年前我看到的所有旧的“演示”都使用了一个调色板的8位位图。放弃了放置,让您留下8位数字,给您256个不同的高度。这是一个处理24位bmp和directX的页面。 http://rastertek.com/tertut02.html – enhzflep

回答

0

一旦你有映射到一个缓冲器中的像素,内插颜色值作为整数(范围从0到255)到您的高度范围。如果您正在使用3通道图像(RGB),则需要先将通道平均到一个值(即。(r + g + b)/ 3)。这会给你一个像素值。

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

+0

我正在尝试从高度图创建地形。我已经将bmp加载到了一个表面上,如代码中所示。我问如何访问特定像素上的数据以获取其颜色,以便我可以将其用作高度。所以之后我可以创建缓冲区。 – Crackerhead

+0

如果您已将其加载到曲面,请使用LockRect()获取指向像素缓冲区的指针。我不确定DirectX是如何工作的,但是您可能希望避免为高度贴图加载表面,因为曲面被指定为纹理。在DirectX之外还有其他方法可以加载DIB的像素数据。 DIB是windows bmp格式。这是一个相对简单的格式。 –

+0

我有一些DIB加载代码,可以将DIB bmp加载到缓冲区中。如果您想要上述代码的副本,请发送电子邮件至[email protected] –

相关问题