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

为什么要使用索引方式,总体来说提高性能。如何提高:使用顶点数组的好处是避免大量的函数调用。即避免每画一个顶点就调用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[] = {0,1,2};
void init()
{
    glEnableClientState(GL_VERTEX_ARRAY);//激活顶点数组
    glVertexPointer(2,GL_FLOAT,0,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<0)
    {
        h=1;
    }
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-100,100,-100,100,-100,100);
}

int _tmain(int argc, _TCHAR* argv[])  
{  
    glutInit(&argc, (char**) argv);  
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);  
    glutInitWindowPosition(100,100);  
    glutInitWindowSize(320,320);  
    glutCreateWindow("Hello OpenGL");  
    glutDisplayFunc(renderScene); 
    glutReshapeFunc(Reshape);
    init();
    glutMainLoop();//enters the GLUT event processing loop.  
    return 0;  
}  

效果如下:

(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};

 

下一篇介绍多边形贴纹理

 

版权声明:本文为U-tansuo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/U-tansuo/p/opengl_Polygon_2.html