在遊戲製作中的地形渲染terrainrender(轉)

post0發表於2007-08-12
在遊戲製作中的地形渲染terrainrender(轉)[@more@]

  地形渲染是個很有用的技巧。經常用來渲染顯示世外場景和地貌形態。在DX SDK裡有不少terrain render的運用。比如公告牌的例子和實時影子渲染的例子裡都用到了地形渲染。

  

  其實地形渲染就是以一個數學函式生成地表的高度值。使得地面呈現出高低不平的樣子。使用不同的高度生成函式,就可能出現不同的地貌。比如生成高山的樣子,或者起伏的丘陵的樣子。

  

  這裡我把一個terrain render的示例完整的分離出來。

  

  下面是地形渲染的關鍵,一個行內函數。它的作用是根據x,z座標值來生成y值,即地表高度值。使用行內函數是為了程式執行取得更高的效率。

  

  inline FLOAT HeightField( FLOAT x, FLOAT y )

  {

  return 9*(cosf(x/20+0.2f)*cosf(y/15-0.2f)+1.0f);

  }

  

  你可以用想象力自己改寫這個函式 :),可以生成千奇百怪的地形。

  

  這是生成地表的過程。這裡用一個扁平mesh來做地表。然後按一定格式取出它的高度值,用我們的高度生成函式來改寫它。

  

  if( FAILED( m_pTerrain->Create( m_pd3dDevice, _T("SeaFloor.x") ) ) )

  return D3DAPPERR_MEDIANOTFOUND;

  

  // Add some "hilliness" to the terrain

  LPDIRECT3DVERTEXBUFFER8 pVB;

  if( SUCCEEDED( m_pTerrain->GetSysMemMesh()->GetVertexBuffer( &pVB ) ) )

  {

  struct VERTEX { FLOAT x,y,z,tu,tv; };

  VERTEX* pVertices;

  DWORD dwNumVertices = m_pTerrain->GetSysMemMesh()->GetNumVertices();

  

  pVB->Lock( 0, 0, (BYTE**)&pVertices, 0 );

  

  for( DWORD i=0; i  pVertices[i].y = HeightField( pVertices[i].x, pVertices[i].z );

  

  pVB->Unlock();

  pVB->Release();

  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-952136/,如需轉載,請註明出處,否則將追究法律責任。

相關文章