[转]OpenGL快速渲染函数glDrawElements使用说明
来源:互联网 发布:linux 关闭wlan0 指令 编辑:程序博客网 时间:2024/06/05 15:15
OpenGL基本的绘图函数例如glVertex、glNormal等在调试模式下运行时,如果模型的顶点数或者三角面数过大(比如超过一万时),则程序运行速度会非常慢,根本就无法进行正常的调试。为此查阅了相关资料,找到glArrayElement、glDrawElements这两个个函数。这两个函数都能通过少数几条语句的调用实现大量数据的绘制,从而节省了函数调用的资源占用。
glArrayElement函数用法简单直接,只要把所有的顶点、法向量等数据,按照三角形的顺序准备好,就可以直接渲染,但缺点是不支持顶点索引,所以内存占用比较大。举例来说,如果一个网格有100个顶点,一般大约会有200个三角面,如果使用glArrayElement就需要存储200×3=600个顶点的数据,相比原有的数据多了5倍。如果是已经条带化的数据,这种冗余数据多的可能就不只5倍了。权衡之下还是决定使用glDrawElements函数。
glDrawElements函数支持顶点数据列表,更为方便的是它还支持顶点索引,所以就成为了快速渲染的首选。可是我在具体使用过程中,却总是没有任何顶点数据被绘制出来,查了相关资料,既不是数据错误,也不是硬件不支持,只好暂时搁置一边了。一个偶然的机会,我看到某段示例代码,发现glDrawElements中索引数据类型的参数是GL_UNSIGNED_INT,而我之前用的参数都是GL_INT(因为算法的需要,有时需要存储负数索引,以表示正反方向的不同)。抱着试试看的想法,我把参数改成了GL_UNSIGNED_INT,结果竟然绘制出图像来了。赶紧查阅了MSDN,对glDrawElements的说明如下:
void glDrawElements(
GLenum mode,
GLsizei count,
GLenum type,
const GLvoid *indices
);
GLenum mode,
GLsizei count,
GLenum type,
const GLvoid *indices
);
Parameters
- mode
- The kind of primitives to render. It can assume one of the following symbolic values: GL_POINTS, GL_LINE_STRIP, GL_LINE_LOOP, GL_LINES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_TRIANGLES, GL_QUAD_STRIP, GL_QUADS, and GL_POLYGON.
- count
- The number of elements to be rendered.
- type
- The type of the values in indices. Must be one of GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, or GL_UNSIGNED_INT.
- indices
- A pointer to the location where the indices are stored.
注意其中对type参数的说明,索引数据的类型必须是GL_UNSIGNED_BYTE、GL_UNSIGNED_SHORT、GL_UNSIGNED_INT之一。这一来就解释了为什么glDrawElements没有绘制出任何元素的问题所在了。可气的是OpenGL竟然没有对这个问题给出任何的提示,不知到是不是微软有意如此淡化OpenGL的作用,如果改天有机会可以用linux系统下的编译器作作测试。
最后,附上我在渲染时调用的部分代码。
//顶点
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, (float*)m_vDataCoord[0]);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, (float*)m_vDataCoord[0]);
// 法向量
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, (float*)m_vDataNormal[0]);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, (float*)m_vDataNormal[0]);
//顶点颜色
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0, (float*)m_vDataColor[0]);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3, GL_FLOAT, 0, (float*)m_vDataColor[0]);
//纹理坐标
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, (float*)m_vDataUv[0]);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, 0, (float*)m_vDataUv[0]);
glDrawElements(GL_TRIANGLES, (GLsizei)m_vIndexCoord.size()*3, GL_UNSIGNED_INT, (GLvoid*)m_vIndexCoord[0]);
- [转]OpenGL快速渲染函数glDrawElements使用说明
- OpenGL ES之glDrawElements 函数
- OpenGL ES之glDrawElements 函数
- OPENGL顶点数组, glDrawArrays,glDrawElements (转)
- glDrawElements(函数)
- OpenGL API glDrawElements
- opengl glDrawElements和glDrawArray
- OpenGL: glDrawArrays & glDrawElements
- Opengl ES----glDrawArray和glDrawElements
- 顶点数组, glDrawArrays,glDrawElements - [OpenGL]
- OPENGL顶点数组, glDrawArrays,glDrawElements
- Opengl ES----glDrawArray和glDrawElements
- Opengl ES----glDrawArray和glDrawElements
- OPENGL顶点数组, glDrawArrays,glDrawElements
- glDrawElements函数应用
- glDrawElements
- opengl 渲染管线(转)
- OpenGL: OpenGL渲染流程
- 经典网摘
- ASP.NET中利用JS实现图片滚动
- .NET中Application,Session,Cookie,ViewState,Cache,Hidden 缓存机制
- 表值函数和标量值函数
- .net页面生命周期
- [转]OpenGL快速渲染函数glDrawElements使用说明
- 杂论C语言指针笔记(二)
- 自定义过滤条件
- sql2005 无法解决 equal to 操作"Chinese_PRC_CI_AS" 和 "Chinese_PRC_CS_AS" 之间的排序
- SQL Server 管理对象
- Mysql的GROUP_CONCAT()函数使用方法----多行合并函数
- 关于QT控件的new 与 delete
- Delphi的Lisence被破坏,无法启动!Borland license information was found,but it is not valid for delph
- AOP的应用领域[转载]