簡體   English   中英

讀取包含Heightmap的.raw文件

[英]Reading .raw file containing Heightmap

我正在使用libnoise庫生成隨機地形,並將其保存在高程以米為單位的.raw文件中。 該地形文件包含16位帶符號的big-endian值,按行優先順序排列,從南到北排序。 這是我用來讀取文件的代碼。

struct HeightMapType
    {
        float x, y, z;
        float nx, ny, nz;
        float r, g, b;
    };

bool Terrain::LoadRawFile()
{
    int error, i, j, index;
    FILE* filePtr;
    unsigned long long imageSize, count;
    unsigned short* rawImage;


    // Create the float array to hold the height map data.
    m_heightMap = new HeightMapType[m_terrainWidth * m_terrainHeight];
    if(!m_heightMap)
    {
        return false;
    }

    // Open the 16 bit raw height map file for reading in binary.
    error = fopen_s(&filePtr, m_terrainFilename, "rb");
    if(error != 0)
    {
        return false;
    }

    // Calculate the size of the raw image data.
    imageSize = m_terrainHeight * m_terrainWidth;

    // Allocate memory for the raw image data.
    rawImage = new unsigned short[imageSize];
    if(!rawImage)
    {
        return false;
    }

    // Read in the raw image data.
    count = fread(rawImage, sizeof(unsigned short), imageSize, filePtr);
    if(count != imageSize)
    {
        return false;
    }

    // Close the file.
    error = fclose(filePtr);
    if(error != 0)
    {
        return false;
    }

    // Copy the image data into the height map array.
    for(j=0; j<m_terrainHeight; j++)
    {
        for(i=0; i<m_terrainWidth; i++)
        {
            index = (m_terrainWidth * j) + i;

            // Store the height at this point in the height map array.
            m_heightMap[index].y = (float)rawImage[index];
        }
    }

    // Release the bitmap image data.
    delete [] rawImage;
    rawImage = 0;

    // Release the terrain filename now that it has been read in.
    delete [] m_terrainFilename;
    m_terrainFilename = 0;

    return true;
}

該代碼未返回任何錯誤,但這是呈現的結果: rawFileRendering

我使用保存在原始文件(由rastertek提供)中的另一個高度圖對代碼進行了測試,並且可以正常工作。

您知道渲染的場景為什么會這樣嗎? 謝謝您的幫助。

兩個問題:

  1. 您使用unsigned short ,但是在描述中您說數字是帶符號的。 因此,您應該使用帶signed short代替
  2. 您不會對字節序進行任何操作。 如果您使用的是小端字節序計算機,則應將值從大端字節序轉換為小端字節序。

您可以通過以下方式轉換字節序:

short endianConvert(short x) {
    unsigned short v = (unsigned short)x;
    return (short)(v>>8|v<<8);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM