2016-05-08 16 views
0

私は地形をdirectx 11でレンダリングし、そこにheightmapを適用しようとしています。 高さマップをロードして整数ベクトルにコピーした後、各頂点位置に対して、その頂点のY位置をheightmap値に割り当てますが、地形は完全に破壊されて歪んでいます。 Y軸の計算を取り除くと、フラットなグリッドが得られ、問題はありません。ここdirectxで地形をレンダリングする11

bool cGrid::readRawFile(std::string fileName, int m, int n) 
{ 
    // A height for each vertex 
    std::vector<BYTE> in(m*n); 
    std::ifstream inFile(fileName.c_str(), std::ios_base::binary); 
    if (!inFile) 
     return false; 
    inFile.read(
     (char*)&in[0], // buffer 
     in.size());// number of bytes to read into buffer 
    inFile.close(); 
    // copy BYTE vector to int vector 
    m_heightmap.resize(n*m); 
    for (int i = 0; i < in.size(); i++) 
     m_heightmap[i] = in[i]; 
    return true; 
} 

for (size_t i = 0; i<m_Mesh.m_Vertices.size(); ++i) 
    { 
     XMFLOAT3 p = m_Mesh.m_Vertices[i].Position; 
     p.y = (float)m_heightmap[i]*0.5f; 
     m_Mesh.m_Vertices[i].Position = p; 
    } 

は問題

https://www.youtube.com/watch?v=lnlIz3DjebM&feature=youtu.beenter image description here

enter image description here

HRESULT cGrid::CreateGrid(float width, float depth, UINT n, UINT m) 
{ 
    HRESULT hr; 
    int vertexCount = m*n; 
    UINT faceCount = (m - 1)*(n - 1) * 2; // each quad consists of two triangles 

    float halfWidth = 0.5f*width; 
    float halfDepth = 0.5f*depth; 

    // project the grid into xz plane 
    float dx = width/(n - 1); 
    float dz = depth/(m - 1); 

    float du = 1.0f/(n - 1); // texture co-ordinates 
    float dv = 1.0f/(m - 1); 


    m_Mesh.m_Vertices.resize(vertexCount); 

    // build the vertices of the grid, including the normals and the tangent, 
    //you can build then the bitanget by cross product for normal maps -_- 

    for (UINT i = 0; i < m; ++i) 
    { 
     float z = halfDepth - i*dz; // reset for the next cell 
     for (UINT j = 0; j < n; ++j) 
     { 
      float x = -halfWidth + j*dx; 
      float y = (float)m_heightmap[j + i*m]; 
      m_Mesh.m_Vertices[i*n + j].Position = XMFLOAT3(x, y, z); 
//   m_Mesh.m_Vertices[i*n + j].Normal = XMFLOAT3(0.0f, 1.0f, 0.0f); 
//   m_Mesh.m_Vertices[i*n + j].TangentU = XMFLOAT3(1.0f, 0.0f, 0.0f); 

      // Stretch texture over grid. 
      m_Mesh.m_Vertices[i*n + j].TextureCords.x = j*du; 
      m_Mesh.m_Vertices[i*n + j].TextureCords.y = i*dv; 
     } 
    } 

    m_Mesh.m_Indices.resize(faceCount * 3); // 3 indices per face 

    // Iterate over each quad and compute indices. 
    UINT k = 0; 
    for (UINT i = 0; i < m - 1; ++i) 
    { 
     for (UINT j = 0; j < n - 1; ++j) 
     { 
      m_Mesh.m_Indices[k] = i*n + j; 
      m_Mesh.m_Indices[k + 1] = i*n + j + 1; 
      m_Mesh.m_Indices[k + 2] = (i + 1)*n + j; 

      m_Mesh.m_Indices[k + 3] = (i + 1)*n + j; 
      m_Mesh.m_Indices[k + 4] = i*n + j + 1; 
      m_Mesh.m_Indices[k + 5] = (i + 1)*n + j + 1; 

      k += 6; // next quad 
     } 
    } 

    m_IndicesSize = m_Mesh.m_Indices.size(); 


    // Pack all the vertices into vertex buffer 
    D3D11_BUFFER_DESC vbd; 
    vbd.Usage = D3D11_USAGE_IMMUTABLE; 
    vbd.ByteWidth = sizeof(MeshVertex)* vertexCount; 
    vbd.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
    vbd.CPUAccessFlags = 0; 
    vbd.MiscFlags = 0; 
    D3D11_SUBRESOURCE_DATA vinitData; 
    vinitData.pSysMem = &(m_Mesh.m_Vertices[0]); 
    m_pGraphics->getDevice()->CreateBuffer(&vbd, &vinitData, &mVB); 

    // Pack the indices of all the meshes into one index buffer. 
    D3D11_BUFFER_DESC ibd; 
    ibd.Usage = D3D11_USAGE_DEFAULT; 
    ibd.ByteWidth = sizeof(UINT)* m_IndicesSize; 
    ibd.BindFlags = D3D11_BIND_INDEX_BUFFER; 
    ibd.CPUAccessFlags = 0; 
    ibd.MiscFlags = 0; 
    D3D11_SUBRESOURCE_DATA iinitData; 
    iinitData.pSysMem = &m_Mesh.m_Indices[0]; 
    m_pGraphics->getDevice()->CreateBuffer(&ibd, &iinitData, &mIB); 

    // Create the constant buffer 
    ibd.Usage = D3D11_USAGE_DEFAULT; 
    ibd.ByteWidth = sizeof(ConstantBuffer); 
    ibd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; 
    ibd.CPUAccessFlags = 0; 
    hr = m_pGraphics->getDevice()->CreateBuffer(&ibd, nullptr, &m_pConstantBuffer); 
    if (FAILED(hr)) 
     return hr; 

    return hr; 
} 
+0

あなたは良い参考のために見ることができる提案一つのことは、DirectX 10とDirectXの下http://www.rastertek.comで発見することができ地形胸が張り裂けるチュートリアルであるため11の地形のチュートリアルは、 "歴史的なチュートリアル"の下にあります。 –

+0

(続き...)また、シリーズ2の下に、DirectX 11用の地形チュートリアル用のフルバージョンが追加されています。 –

答えて

1

std::vector<BYTE> in(m*n)を定義するとき、それはの一部ではないので、私はunsigned charの代わり​​を使用するのビデオですCの標準ライブラリであるため、システムに依存します。

またstd::streamsizeあるifstream::readの実際のパラメータの型に、このライン上

in.size());// number of bytes to read into buffer 

をキャストを使用。このよう

for (int i = 0; i < in.size(); i++) 
    m_heightmap[i] = in[i]; 

(std::streamsize)in.size());// number of bytes to read into buffer 

あなたは8ビットの高さマップで作業しているので、あなたはおそらくちょうどこのようなあなたのハイトマップにRAWファイルから値をコピーするべきではありません

各高さマップの値は8ビット整数で表されるので、高さマップの値を分割し、いくつかのスケール修飾子でそれを掛けることもできます。これは、いくつかの良い値を試してみたい場合に便利です。純粋に視覚的な目的のために...

for (int i = 0; i < in.size(); i++) 
    m_heightmap[i] = (float)(in[i]/255.0f) * scaleModifier; 
+0

コメントを適用した後、ちょうどフラットな鳥が得られます。地形は全くありません –

+0

上記の投稿の添付の画像を見てください。今私はそのような列車を手に入れます。ちょうどいくつかのスパイク –

+0

私は高さのマップを添付 –

関連する問題