顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用。使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERTEX_ARRAY(顶点数据)和GL_COLOR_ARRAY(颜色数组),颜色数组可以为每个顶点分别分配颜色。

glVertexPointer (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);

第一个参数size,代表顶点数组中数据的维度,只能是2,3或4,即二维、三维、四维;

第二个参数type,代表顶点数组中每个数据的类型,如GL_INT,GL_FLOAT;

第三个参数stride,代表连续顶点之间的字节偏移量,经常使用一个int型常量乘以sizeof(int/float)来表示;

第四个参数pointer,指向数组数据的起始位置;

glDrawElements (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)

第一个参数mode指定用顶点数组创建的图元的类型;

第二个参数count,代表整个图元包含的顶点数;

第三个参数type,是顶点数组序列数据的类型,GL_UNSIGNED_BYTE或GL_UNSIGNED_INT;

第四个参数indices,顶点数组序列数据的起始位置;

glDrawArrays (GLenum mode, GLint first, GLsizei count);

第一个参数mode指定用顶点数组创建的图元的类型;

第二个参数first指定从顶点数组内起始的位置偏移量;

第三个参数count指定顶点数量;

用顶点数组绘制立方体的三个面:

#include <glut.h> 

GLsizei windowWidth=400,windowHeight=400;
GLfloat data[]={-10,-10,10,1,0,0,
10,-10,10,0,1,0,
10,10,10,0,0,1,
-10,10,10,1,1,0,
-10,-10,-10,1,0,1,
10,-10,-10,0,1,1,
10,10,-10,1,1,1};
GLubyte index[]={0,1,2,3,4,5,1,0,2,1,5,6}; void Init()
{
glEnable(GL_DEPTH_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(75,1,1,50);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(20,-20,30,0,0,0,0,1,0);
} void Display()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(3,GL_FLOAT,6*sizeof(GLfloat),&data[3]);
glVertexPointer(3,GL_FLOAT,6*sizeof(GLfloat),&data[0]);
//glDrawArrays(GL_QUADS,0,8);
glDrawElements(GL_QUADS,12,GL_UNSIGNED_BYTE,index);
glutSwapBuffers();
} int main(int argc, char *argv[])
{
glutInit(&argc, argv); //初始化GLUT
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutInitWindowPosition(500, 200);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("OpenGL");
Init();
glutDisplayFunc(&Display); //回调函数
glutMainLoop();
}

光栅是一个一个离散的单元,在显示的时候具有锯齿形或阶梯状外观,这种由于低频取样(不充分取样)导致的信息失真的情况称为走样,OpenGL中可以对走样进行校正。

对于点的反锯齿校正使用glEnable(GL_POINT_SMOOTH)启用对点的锯齿校正,glHint (GL_POINT_SMOOTH, GL_NICEST)函数来进行校正。

glHint函数的第一个参数是校正的图元类型:

  1. GL_POINT_SMOOTH 点
  2. GL_LINE_SMOOTH 线
  3. GL_POLYGON_SMOOTH 多边形

第二个参数是对校正效果的设定:

  1. GL_DONT_CARE  不校正
  2. GL_FASTEST  优先考虑处理速度
  3. GL_NICEST     优先考虑显示质量

#include <glut.h> 

GLsizei windowWidth=400,windowHeight=400;

void Init()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0,400,0,400);
} void Display()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0,0,1);
glPointSize(10); glBegin(GL_POINTS);
glVertex2f(100,300);
glEnd(); glEnable(GL_POINT_SMOOTH);
glHint(GL_POINT_SMOOTH,GL_NICEST); glBegin(GL_POINTS);
glVertex2f(130,300);
glEnd();
glDisable(GL_POINT_SMOOTH); glColor3f(1,0,0);
glLineWidth(10); glBegin(GL_LINES);
glVertex2f(80,120);
glVertex2f(280,320);
glEnd(); glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH,GL_FASTEST); glBegin(GL_LINES);
glVertex2f(80,80);
glVertex2f(280,280);
glEnd(); glDisable(GL_LINE_SMOOTH); glFlush();
} int main(int argc, char *argv[])
{
glutInit(&argc, argv); //初始化GLUT
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutInitWindowPosition(500, 200);
glutInitWindowSize(windowWidth, windowHeight);
glutCreateWindow("OpenGL");
Init();
glutDisplayFunc(&Display); //回调函数
glutMainLoop();
}

左侧是没有经过反走样校正的点和线,右侧经过校正:




最新文章

  1. wpf,能够复制文字 及自动识别URL超链接的TextBlock
  2. c/c++ string.h
  3. loj 1337
  4. Twitter 登录和分享
  5. PHP $_SERVER[&#39;HTTP_REFERER&#39;] 获取前一页面的 URL 地址
  6. 98、EditText 按键盘查询 触发事件
  7. hdu 5532 Almost Sorted Array
  8. 随机森林之Bagging法
  9. Libreoffice汉化
  10. MVC+Repository+UOW+EntityFrmeWork的使用
  11. ASP.NET没有魔法——ASP.NET Identity 的“多重”身份验证
  12. Java 8 基础API的一些小的该进
  13. day12 函数的使用方法:初识迭代器和生成器
  14. JVM的新生代、老年代、MinorGC、MajorGC
  15. JQuery+Ajax实战三级下拉列表联动(八)
  16. NAND FLASH控制器
  17. 数据仓库专题(21):Kimball总线矩阵说明-官方版
  18. shell變量和數組
  19. SqlServer中批量update
  20. Hibernate插入、查询、删除操作 HQL

热门文章

  1. heredoc(实现模板与代码的分离)
  2. 字典(dictionary)的设计
  3. 《SPA设计与架构》之客户端路由
  4. UE4 Editor快捷键(ShortCut Key)
  5. 12行Python暴力爬《黑豹》豆瓣短评
  6. iOS中OC给Category加入属性
  7. js进阶 11-18 jquery中操作选择器的方法有哪些
  8. 在 Java 中如何进行 BASE64 编码和解码
  9. [Git] How to rename your remote branch
  10. 安装alien,DEB与RPM互换