0

そのため、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();

構造体は次のように定義されます。

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

1 に答える 1

0

ピクセルをバッファーにマップしたら、色の値を整数 (0 から 255 の範囲) として高さの範囲に補間します。3 チャンネルの画像 (rgb) を使用している場合は、最初にチャンネルを 1 つの値に平均化する必要があります (つまり (r + g + b) / 3)。これにより、ピクセルの単一の値が得られます。

ピクセル範囲から高さ範囲に変換するには、「線形補間」を参照してください。ピクセル値自体にアクセスする方法を尋ねている場合、それはビットマップのロードに使用される方法によって異なります。

于 2013-10-29T05:43:36.527 に答える