OpenGL 学习笔记(4)顶点数组
2010-10-16 23:11 Clingingboy 阅读(15694) 评论(2) 编辑 收藏 举报
当我们人为的绘制形状时,首先想到是是坐标点,而不是api,如要绘制一条直线,首先将两个点的坐标存在一起,则更加容易理解,OpenGL的顶点数组就是这样的作用.
首先来回顾下之前画直线的函数
示例1
void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2)
{
glBegin(GL_LINES);
glVertex2f ((x1),(y1));
glVertex2f ((x2),(y2));
glEnd();
}
需要调用两次glVertex2f ,并且输入两个顶点,现在我们来看另一种做法
将坐标存在一个数组中
示例2
void drawLineWithArray()
{
GLint vertices[]={25,25,
100,100};
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2,GL_INT,0,vertices);
glBegin(GL_LINES);
glArrayElement(0);
glArrayElement(1);
glEnd();
}
vertices记录了两个坐标(x1,y1)=(25,25),(x2,y2)=(100,100)
但是其索引值却是0,1,2,3.为了识别一个坐标点,需要一个函数将数组进行切分.
glVertexPointer则用于这个功能,可以称这种数组为混合数组,参数指定了顶点数组的配对点(如坐标定位为2个,颜色则为3个),数据类型及数组
注意:在使用顶点数组时,必须先调用glEnableClientState开启顶点数组功能,在不用的时候调用glDisableClientState来禁用
glArrayElement则根据顶点数组来调用相应的函数,每次只调用1个顶点
示例2和示例1的效果是相同,初看好像并没有变简单,反而变复杂了.
启用多个顶点数组
除了指定顶点的坐标数组外,还可以启动颜色,表面法线等其他顶点数组
下面以不同颜色画两条直线
示例3
void drawTwoLineWithArray()
{
GLint vertices[]={25,25,
100,100,
120,120,
200,200};
GLfloat colors[]={1.0, 0.0, 0.0,
1.0, 0.0, 0.0,
0.0, 1.0, 0.0,
0.0, 1.0, 0.0};
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(2,GL_INT,0,vertices);
glColorPointer(3,GL_FLOAT,0,colors);
glBegin(GL_LINES);
glArrayElement(0);
glArrayElement(1);
glArrayElement(2);
glArrayElement(3);
glEnd();
}
注意:每开启一种顶点数组都必须调用glEnableClientState来激活
效果如下
跨距
如上示例3,有一个坐标数组和颜色数组,如果将两个数组合并在一起,那么坐标和颜色的数据就在一个数组了,现在代码修改如下
示例4
GLfloat data[]= {1.0, 0.0, 0.0,25.0,25.0, 1.0, 0.0, 0.0,100.0,100.0, 0.0, 1.0, 0.0,120.0,120.0, 0.0, 1.0, 0.0,200.0,200.0}; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&data[0]); glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&data[3]);
第3个参数指定跨距,如颜色,从数组的每组数据的第1个开始取数据,然后跨5个,坐标顶点则从数据每组数据的第4个开始取数据并跨5个
注意:由于跨距需要计算数据类型,所以数组的数据类型需要相同
以上代码效果是相同的
解引用顶点数组列表
1.其提供了一个glDrawElements函数用于循环调用glArrayElement,但需要定义一个索引的数组
示例5
void drawTwoLineWithArray2() { GLfloat data[]= {1.0, 0.0, 0.0,25.0,25.0, 1.0, 0.0, 0.0,100.0,100.0, 0.0, 1.0, 0.0,120.0,120.0, 0.0, 1.0, 0.0,200.0,200.0}; GLubyte index[]= {0,1,2,3} ; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3,GL_FLOAT,5*sizeof(GLfloat),&data[0]); glVertexPointer(2,GL_FLOAT,5*sizeof(GLfloat),&data[3]); glDrawElements(GL_LINES,4,GL_UNSIGNED_BYTE,index); }
2.从索引项开始
glDrawArrays(GL_LINES,0,4);
这个函数更加简单,直接从第0个开始访问4个元素
在顶点比较多的情况下,顶点数组应该是很有用的一个功能
混合数组
以下是最简化的操作
glInterleavedArrays函数将会根据参数,激活各种顶点数组,并存储顶点,如下
void drawTwoLineWithArray3()
{
GLfloat data[]= {1.0, 0.0, 0.0,25.0,25.0,0.0,
1.0, 0.0, 0.0,100.0,100.0,0.0,
0.0, 1.0, 0.0,120.0,120.0,0.0,
0.0, 1.0, 0.0,200.0,200.0,0.0};
glInterleavedArrays(GL_C3F_V3F,0,data);
glDrawArrays(GL_LINES,0,4);
}
效果是相同的
现在去掉颜色的数组的话,代码如下
GLfloat data[]= {25.0,25.0, 100.0,100.0, 120.0,120.0, 200.0,200.0}; glInterleavedArrays(GL_V2F,0,data); glDrawArrays(GL_LINES,0,4);上述代码可看性就比较高了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现