浏览 1621 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-05
在3D中,LOST OF DETAIL 是一种避免过多渲染细节的方法。
在以上图中: errorH表示图块失去细节后所失去的高度。 因此根据三角形相似可以求出d. CB 为errorH的投影。 当CB为一个阀值的时候,errorH可以被忽略。 errorH越远,CB越短,当短到人的肉眼可以忽略的时候,说明errorH从错误变成了可以忽略的误差。这个时候,细节图可以被更高级别模糊度的图块所取代。
公式就是三角形相似外加坐标转换,像素坐标转换为自定义坐标。
代码如下:
//earlier in the file: inline int PINDEX( int x, int z ) { return x * 33 + z; } void CScape::CalcErrors( float MaxError, int Vres, float FoV, float NearClip ) { //vars for de Boer's equations float C, A, T; T = 2 * MaxError / Vres; //convert FoV to radians FoV *= PI / 180.0f; A = 1.0f / (float) tan( FoV / 2.0f ); C = A / T; //go through all of the vertices that will be removed and calc errors /* *-----*-----*-----*-----* | | | | | | | | | | | | | | | | | | | | *-----*-----*-----*-----* | | | | | | | | | | | | | | | | | | | | *-----*-----*-----*-----* | | | | | | | | | | | | | | | | | | | | *-----*-----*-----*-----* | | | | | | | | | | | | | | | | | | | | *-----*-----*-----*-----* */ int x, z, l, p; ScapePatch* Patch; float Delta; ScapeVertex* Vert; for( p = 0; p < m_NumPatches; ++p ) { Patch = &m_Patches[p]; Delta = 0.0f; for( l = 0; l < 4; l++ ) { int start = (int)fastpow( 2.0f, l ); int inc = start*2; //first set of removed vertices for( x = start; x < 33; x+=inc ) { for( z = start; z < 33; z+=inc ) { Vert = &Patch->Vertices[PINDEX(x,z)]; Delta = Max( Delta, fabsf(Vert->y-(Patch->Vertices[PINDEX(x-start,z-start)].y + Patch->Vertices[PINDEX(x+start,z+start)].y) / 2.0f) ); Delta = Max( Delta, fabsf(Vert->y-(Patch->Vertices[PINDEX(x+start,z-start)].y + Patch->Vertices[PINDEX(x-start,z+start)].y) / 2.0f) ); } } Patch->D[l] = Delta * C; } } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |