上篇介绍了最基本的三角形绘制,本篇介绍如何使用索引的方式绘制多边行。

为什么要使用索引方式,总体来说提高性能。如何提高:使用顶点数组的好处是避免大量的函数调用。即避免每画一个顶点就调用1次glVertex*()。
另一个好处是避免多边形相邻顶点的冗余指定。例如正方体,分别描述6个正方形,会造成每个顶点被重复描述3次。

如果以上没有说服力,看看这个, gl.Begin(),gl.End()对是一种低效的方式,因此opengl es干脆不再支持他们了,同时高版本的opengl都在弃用gl.Begin(),gl.End()

先了解一些基本的API:

(1)glEnableClientState(枚举值),参数支持顶点,颜色等等。作用激活选择的数组,例如:glEnableClientState(GL_VERTEX_ARRAY)表示激活顶点数组

(2)glVertexPointer(size,type,stride,*pointer) size:每个顶点坐标的数量,type 每个坐标的数据类型,stride:连接顶点的之间的偏移值,pointer:顶点数据的指针;作用 :指定顶点数据的数组

与之同类的包括 顶点 法线 纹理等等。

(3)glDrawElements(model,count,type,indices) model:那种类型的图元(点 线 三角形等),count:数组的元素个数,type:数组中元素的数据类型,indices:存放索引的数组;作用:解引用数组元素的一个列表 我也没大明白啥意思,用熟了大概就理解了。

(4)glutReshapeFunc(func)  窗口大小发生改变时 会回调func

直接上代码:

#include "stdafx.h"
#include<gl/glut.h>
float vertices[] = {-50.0,-50.0,
50.0,-50.0,
-50.0,50.0,
50.0,50.0};
GLuint indexs[] = {,,};
void init()
{
glEnableClientState(GL_VERTEX_ARRAY);//激活顶点数组
glVertexPointer(,GL_FLOAT,,vertices);
}
void renderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawElements(GL_TRIANGLES,sizeof(indexs),GL_UNSIGNED_INT,indexs);//以三角形方式绘制 sizeof(indexs)取得数组元素的个数
glutSwapBuffers();
} void Reshape(GLsizei w,GLsizei h)
{
if(h<)
{
h=;
}
glViewport(,,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-,,-,,-,);
} int _tmain(int argc, _TCHAR* argv[])
{
glutInit(&argc, (char**) argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(,);
glutInitWindowSize(,);
glutCreateWindow("Hello OpenGL");
glutDisplayFunc(renderScene);
glutReshapeFunc(Reshape);
init();
glutMainLoop();//enters the GLUT event processing loop.
return ;
}

效果如下:

(5)白色太难看了吧 来给上点色(下面不会再贴全部代码,贴核心代码)

float colors[] = {1.0,0.0,0.0,
    1.0,0.0,0.0,
    1.0,0.0,0.0,
    1.0,0.0,0.0};//定义颜色数组

初始化函数里面激活颜色数组 并绑定颜色数组

glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3,GL_FLOAT,0,colors);

这不效果出来了:

(6)绘制四边形,非常easy,只需要改一下数组的索引 GLuint indexs[] = {0,1,2,2,3,1};

下一篇介绍多边形贴纹理

[原]OpenGL基础教程(二)多边形绘制的更多相关文章

  1. [原]OpenGL基础教程(一)多边形绘制

    1.opengl开发环境搭建 参考http://brothergrup.iteye.com/blog/1602471 2.为三角形填充颜色: 填充颜色函数为glColor(3/4)*(r,g,b)  ...

  2. [原]OpenGL基础教程(四)VBO+纹理绘制四边形

    工程下载地址:http://pan.baidu.com/s/1ntr7NHv 提取码:yf1h 一.本文牵扯知识点梳理: (1)VBO (2)纹理 (3)libpng(加载png) (4)shader ...

  3. [原]OpenGL基础教程(五)缓冲区数据更新方式

    1.glBufferSubData 适用于相同数据类型 void SetPositionY(float y){    vector<Vector3<float>>::itera ...

  4. WebGL入门教程(二)-webgl绘制三角形

    前面已经介绍过了webgl,WebGL入门教程(一)-初识webgl(http://www.cnblogs.com/bsman/p/6128447.html),也知道了如何绘制一个点,接下来就用web ...

  5. OpenGL编程(二)绘制矩形

    上次只是创建了一个简单的窗口,把背景颜色修改为蓝色(默认是黑色),并没有向窗口添加任何图形.这次在上次代码的基础上往窗口中添加一个矩形,设置矩形的颜色,大小等. 1.添加矩形 在(参考上次代码)ren ...

  6. OpenGL入门程序二:绘制简单的圆

    学习 绘制一个圆: ; const float Pi = 3.1415926536f; const float R = 0.5f; //绘制一个圆 void DrawCircle() { //绘制一个 ...

  7. MySQL8.0数据库基础教程(二)-理解"关系"

    1 SQL 的哲学 形如 Linux 哲学一切都是文件,在 SQL 领域也有这样一条至理名言 一切都是关系 2 关系数据库 所谓关系数据库(Relational database)是创建在关系模型基础 ...

  8. Java基础教程——二维数组

    二维数组 Java里的二维数组其实是数组的数组,即每个数组元素都是一个数组. 每个数组的长度不要求一致,但最好一致. // 同样有两种风格的定义方法 int[][] _arr21_推荐 = { { 1 ...

  9. numpy基础教程--二维数组的转置

    使用numpy库可以快速将一个二维数组进行转置,方法有三种 1.使用numpy包里面的transpose()可以快速将一个二维数组转置 2.使用.T属性快速转置 3.使用swapaxes(1, 0)方 ...

随机推荐

  1. SQLSERVER监控复制并使用数据库邮件功能发告警邮件

    SQLSERVER监控复制并使用数据库邮件功能发告警邮件 最近熬出病来了,都说IT行业伤不起,不说了,说回今天的正题 正题 上个月月底的时候因为要搬迁机房,需要将一个数据信息数据库先搬到我们的机房,然 ...

  2. azure存储压测的问题(农码主观意识太强被坑了)

    由于公司想把部份业务迁到windowsazure,主要是应用winodwsazure的存储;在方案中为了体现存储的可靠性所以对winodwsazure存储进行了一系列的测试.但在读取压力测试环节中发现 ...

  3. Linq学习之操作符

    一.环境搭建 下面将逐步搭建我们学习的环境,这个环境不仅仅是这次需要使用,以后的教程一样需要使用这个环境.所以请大家务必按照 搭建这里的环境否则会影响你后面的学习. 我们用到的几张表 通知消息表: 用 ...

  4. [ucgui] 彩色条函数

    /* 颜色条 */ void ShowColorBar(void) { , y0 = , yStep = , i; int NumColors = LCD_GetDevCap(LCD_DEVCAP_N ...

  5. Zabbix学习笔记一:基本安装与配置

    1.下载安装 http://120.52.73.43/tenet.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.0.1/za ...

  6. atitit.二进制数据无损转字符串网络传输

    atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1  (推荐) 2 4. utf-8 ...

  7. 整站HTTPS后的跨域请求 CORS是否还有效?

    | 导语  手Q马上就要全量https了,很多业务都有跨域ajax请求的需求,原来使用的CORS头在HTTPS环境中还继续能用吗?我搜遍了谷歌.百度,都没看到有明确的答案,那么就自己来尝试一下吧. 关 ...

  8. Tomcat日志输出在linux和windows差异

    tomca日志保存在${catalina}/logs目录下: 主要包括五类文件,开发测试常使用的日志主要保存在catalina.localhost日志中,且每天生成独立日志文件,结尾以日期命名,方便查 ...

  9. 基于Chromium构建Chrome WebBrowser for .net 控件(还有点心得体会)

    http://blog.csdn.net/lllllllllluoyi/article/details/8540054 首先向360说句sorry,在2011年360极速浏览器出现的时候我去他们论坛里 ...

  10. Activiti 查询最新版本的流程定义

    package com.mycom.processDefinition; import java.io.File; import java.io.IOException; import java.io ...