会员: 密码:  免费注册 | 忘记密码 | 会员登录 网页功能: 加入收藏 设为首页 网站搜索  
游戏开发 > 程序设计 > 3D图形
地形渲染 terrain render
发表日期:2007-01-24 17:37:08作者: 出处:  

  地形渲染是个很有用的技巧经常用来渲染显示世外场景和地貌形态。在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<dwNumVertices; i++ )
        pVertices[i].y = HeightField( pVertices[i].x, pVertices[i].z );

    pVB->Unlock();
    pVB->Release();
}



这里是terrain render的完整代码
返回顶部】 【打印本页】 【关闭窗口

关于我们 / 给我留言 / 版权举报 / 意见建议 / 网站编程QQ群   
Copyright ©2003- 2024 Lihuasoft.net webmaster(at)lihuasoft.net 加载时间 0.00382