2017-07-12 53 views
0

我正在使用libnoise庫生成隨機地形並將其保存在以。米爲單位測量其仰角點的.raw文件中。這個terrain文件包含16位有符號的big-endian值,按照行優先順序從南到北排列。這是我用來閱讀文件的代碼。讀取包含高度圖的.raw文件

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給出),它的工作原理。

你知道爲什麼渲染場景是這樣嗎? 謝謝你的幫助。

回答

0

兩個問題:

  1. 您使用unsigned short,但你的描述說,數字簽名。所以你應該使用signed short而不是
  2. 你不會做任何與endianness。如果你在一個小端機器上,你應該把你的值從大端轉換爲小端。

可以轉換字節順序與此:

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

感謝您的幫助,但它仍然不會改變渲染的圖像。有沒有辦法找到兩個不同的原始文件之間的差異,以瞭解什麼是錯的? – Swagging

+0

必須有一些變化。如果它根本沒有改變,那麼你的代碼還有一些其他的問題。如果你分享.raw文件,我可以研究它,那裏有什麼。 – geza

+0

好的,謝謝!你可以在這裏找到鏈接:https://drive.google.com/file/d/0B5qZUPGKjCpqUW1iMlVIV3Z0M0E/view?usp=sharing – Swagging

相關問題