//关于思想,整体思想patch
//先定义一系列的顶点:
//给这些点付给固定的纹理和颜色,
void glVertexPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *pointer); pointer is the memory address of the first coordinate of the first vertex in the array. type specifies the data type (GL_SHORT, GL_INT, GL_FLOAT, or GL_DOUBLE) of each coordinate in the array. size is the number of coordinates per vertex, which must be 2, 3, or 4. stride is the byte offset between consecutive vertexes. If stride is 0, the vertices are understood to be tightly packed in the array. To access the other five arrays, there are five similar routines:
void glColorPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *pointer);
void glIndexPointer(GLenum type, GLsizei stride, const GLvoid *pointer);
void glNormalPointer(GLenum type, GLsizei stride,
const GLvoid *pointer);
void glTexCoordPointer(GLint size, GLenum type, GLsizei stride,
const GLvoid *pointer);
void glEdgeFlagPointer(GLsizei stride, const GLvoid *pointer); Specifies where spatial coordinate data can be accessed.
等等。
2.指定渲染路径索引表。(多重渲染用 glMultiTexCoordPointer)
3.渲染。(glDrawElements);
4.LOSE OF Detail 发生在最后的渲染过程。。。
int CScape::RenderPatch( int i )
{
int FacesRendered = 0;
static unsigned short Indices[INDICES_LOD_HIGH];
ScapePatch* Patch = &m_Patches[i];
unsigned short* IndexPtr;
glVertexPointer( 3, GL_FLOAT, sizeof(ScapeVertex), m_Buffer->GetPointer() + (PATCH_VERTS * i * sizeof(ScapeVertex)) );
int CurIndices;
if( Patch->LoD == SCAPE_LOD_HIGH )
{
CurIndices = INDICES_LOD_HIGH;
IndexPtr = m_Indices[0];
}
else if( Patch->LoD == SCAPE_LOD_MED )
{
CurIndices = INDICES_LOD_MED;
IndexPtr = m_Indices[1];
}
else if( Patch->LoD == SCAPE_LOD_LOW )
{
CurIndices = INDICES_LOD_LOW;
IndexPtr = m_Indices[2];
}
else if( Patch->LoD == SCAPE_LOD_XTRALOW )
{
CurIndices = INDICES_LOD_XTRALOW;
IndexPtr = m_Indices[3];
}
else if( Patch->LoD == SCAPE_LOD_MIN )
{
CurIndices = INDICES_LOD_MIN;
IndexPtr = m_Indices[4];
}
memcpy( Indices, IndexPtr, CurIndices * sizeof(unsigned short) );
ScapePatch* Other;
//i是patch的序列号,m_HeightPatches是地图在z方向patch数量
//如果i比m_HeightPatches大。
if( i >= m_HeightPatches )
{
//other是它的left的patch
Other = &m_Patches[i-m_HeightPatches];
//如果left的patch的level of detail >current.level of detail
//也就是说更模糊。
if( Other->LoD > Patch->LoD )
{
//CurIndices,根据SIZE进行调整,
#define INDICES_LOD_HIGH (PATCH_SIZE*PATCH_SIZE*2*3)
#define INDICES_LOD_MED (INDICES_LOD_HIGH / 4)
#define INDICES_LOD_LOW (INDICES_LOD_MED / 4)
#define INDICES_LOD_XTRALOW (INDICES_LOD_LOW / 4)
#define INDICES_LOD_MIN (INDICES_LOD_XTRALOW / 4)
for( int n = 0; n < CurIndices; ++n )
{
//Indices[n]是经过memcopy的。
//下面这块代码用来生成不同ScapeLoD,不同level,patch上边上两个点之间的间隔。
inline void GenIndices( int ScapeLoD, unsigned short* Buffer )
{
int x, z, i, j;
i = 0;
for( z = 0; z < PATCH_SIZE; z+=ScapeLoD )
{
for( x = 0; x < PATCH_SIZE; x+=ScapeLoD )
{
//逆时针哦!!
//指出6个点。一个正方形中的六个
//找出每个正方形点(左上角)的索引(这个索引是)。
j = PINDEX(x,z);
//下边的点
//也就是说PATCH_SIZE+1经过ScapeLod行。
Buffer[i++] = j + (PATCH_SIZE+1) * ScapeLoD;
//右边的点
Buffer[i++] = j + 1 * ScapeLoD;
//本点。
Buffer[i++] = j;
//右下角的点:
Buffer[i++] = j + (PATCH_SIZE+2) * ScapeLoD;
//正右方的点。
Buffer[i++] = j + 1 * ScapeLoD;
//正下方的点。
Buffer[i++] = j + (PATCH_SIZE+1) * ScapeLoD;
}
}
}
//下面这个代码是核心。
//n表示三角形绘制中用到的第n个顶点的索引(也就是在patch中的位置),如果这个顶点的索引,小于PATCH_SIZE+1。说明在第
//说明在第一列。(上面是列进行三角形绘制的。);
//并且这个索引不能被左边的间隔整除。
//说明是非公用点。
if( (Indices[n] < (PATCH_SIZE+1)) && (Indices[n] % Other->LoD) != 0 )
{
//进行调整为:
//比如说10,6;
//取整点
//去除这个点。(需要深刻思考)
//也就是把本来一个正方形有两个三角。
//把它和斜角拉成一条线!退化三角为直线。
Indices[n] -= Indices[n] % Other->LoD;
}
}
}
}
//下面就不分析了,都一样。。。。
if( i <= m_NumPatches - m_HeightPatches )
{
Other = &m_Patches[i+m_HeightPatches];
if( Other->LoD > Patch->LoD )
{
for( int n = 0; n < CurIndices; ++n )
{
if( (Indices[n] > ((PATCH_SIZE+1)*PATCH_SIZE) ) && (Indices[n] % Other->LoD) != 0 )
{
Indices[n] -= Indices[n] % Other->LoD;
}
}
}
}
if( i % m_HeightPatches )
{
Other = &m_Patches[i-1];
if( Other->LoD > Patch->LoD )
{
for( int n = 0; n < CurIndices; ++n )
{
if( (Indices[n] % (PATCH_SIZE+1) == 0) && (Indices[n] % (Other->LoD * (PATCH_SIZE+1))) != 0)
{
Indices[n] -= (PATCH_SIZE+1) * Indices[n] % (Other->LoD * (PATCH_SIZE+1));
}
}
}
}
if( (i + 1) % m_HeightPatches )
{
Other = &m_Patches[i+1];
if( Other->LoD > Patch->LoD )
{
for( int n = 0; n < CurIndices; ++n )
{
if( ((Indices[n] + 1) % (PATCH_SIZE+1) == 0) && (Indices[n] % (Other->LoD * (PATCH_SIZE+1))) != 0)
{
Indices[n] -= (PATCH_SIZE+1) * Indices[n] % (Other->LoD * (PATCH_SIZE+1));
}
}
}
}
glDrawElements( GL_TRIANGLES, CurIndices, GL_UNSIGNED_SHORT, Indices );
FacesRendered = CurIndices / 3;
return FacesRendered;
}
分享到:
相关推荐
《VINS论文推导及代码解析》是一份针对港科大VINS-MONO开源项目的详尽教程,旨在帮助初学者理解和应用视觉SLAM(Simultaneous Localization And Mapping,即同时定位与建图)技术。VINS-MONO是视觉惯性导航系统的一...
### ASP.NET导出Excel方法经典代码解析 #### 一、概述 在Web开发中,将数据导出为Excel格式是一种常见的需求,特别是在企业级应用中。ASP.NET作为一种广泛使用的Web开发框架,提供了丰富的功能来满足这类需求。...
### C语言经典问题及代码解析 #### 1.1 局部程序块(Local Block) **概念解释** 局部程序块指的是由一对大括号 `{}` 包围起来的代码段。在C语言中,几乎所有的控制结构(如 `if`, `for`, `while` 等)都可以包含...
Visual.C#.NET数据库开发经典案例解析(代码)
这份“数据结构经典程序解析(含代码)”的内部资料,对于深入理解数据结构及其应用至关重要。下面将详细阐述其中可能涵盖的关键知识点。 1. **线性数据结构**: - **数组**:基础数据结构,提供随机访问,但插入和...
Visual C#.NET数据库开发经典案例解析(代码) 示例程序都是在Microsoft Visual Studio .NET 2003(简体中文版)和SQL Server 2000个人版下调试通过的,不同的版本可能存在差别。另外,使用的操作系统是Microsoft ...
《SAS开发经典案例解析》以经典案例的形式讲解SAS的实际应用。《SAS开发经典案例解析》共分12章,主要内容包括SAS概述与整体架构、SAS编程语法基础、数据步基础与案例、过程步基础与案例、函数基础与案例、宏基础与...
java经典例题解析,包含答案,分析,代码以及详细的注释,适合初学者快速学习以及了解java循环,嵌套,遍历控制输出等基础流程,并可以在此基础上代码复用,完成其他相关的程序设计,是初学者编程指导的不二选择。
### G代码经典解释程序知识点详解 #### 一、引言 随着数控技术的发展,特别是开放式数控系统的出现,软件设计在数控领域变得尤为重要。G代码作为数控机床编程的标准语言,在实现数控机床自动化生产过程中扮演着...
北京工业大学考研专业课893中数据结构算法经典问题总结,含代码解析,按照考研大纲顺序排列
《Visual FoxPro数据库开发经典案例解析》是一本深入探讨如何使用Visual FoxPro进行数据库开发的专业教程。这本书通过一系列具体的案例,旨在帮助读者掌握Visual FoxPro的核心功能和数据库应用开发技巧。书中涵盖的...
《Delphi数据库经典案例解析》是一本专注于使用Delphi进行数据库应用开发的书籍,其光盘代码包含了丰富的实例,帮助读者深入理解如何在Delphi环境下高效地操作和管理数据库。这本书籍涵盖了从基础到高级的各种数据库...
《Macromedia 大师群英会:Flash经典作品解析》是针对Flash开发者的宝贵资源,其中涵盖了ActionScript编程和Flash交互设计的精髓。在第一章的源代码中,我们能够深入学习如何为Flash注入生命力,使其动画和交互更加...
#### 示例代码解析 在给定的部分内容中,可以看到程序首先读取了输入文件中的顶点数和边的权重,然后通过`init`过程初始化了邻接矩阵。接下来,在`find`过程中,算法遍历所有可能的边,选择权重最小且不形成环路的...
《Delphi7经典问题解析》是一本专注于解决Delphi7开发过程中常见问题的资源集合,对于 Delphi 开发者来说,具有极高的参考价值。Delphi7是一款深受程序员喜爱的集成开发环境(IDE),它以其高效的编译器、强大的VCL...
Delphi 7经典问题解析 随书源代码
《VC++实现的俄罗斯方块游戏代码解析》 在编程世界中,俄罗斯方块是一款经典的电子游戏,它的简单规则和无限挑战性使得它成为初学者学习游戏编程的绝佳选择。本资源提供了一款使用VC++编写的俄罗斯方块游戏源代码,...
这个我也找了好久才弄到的,不容易啊,都是很经典的案例,慢慢享受吧!
Delphi数据库开发经典案例解析-随书源码 Delphi数据库开发经典案例解析-随书源码