顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用。使用顶点数组需要先启用顶点数组功能,使用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();
}

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




OpenGL(十八) 顶点数组和抗锯齿(反走样)设置的更多相关文章

  1. osg如何设置抗锯齿(反走样,反锯齿)

    首先抗锯齿是什么? 举个最简单的例子 你用windows画图软件画一根直线(准确说这个叫做线段),当水平或者垂直的时候,如下图,这是绝对完美的 但是当线段出现倾斜时,就无法做到完美了此时就会出现锯齿 ...

  2. 「kuangbin带你飞」专题十八 后缀数组

    layout: post title: 「kuangbin带你飞」专题十八 后缀数组 author: "luowentaoaa" catalog: true tags: - kua ...

  3. OpenGL:使用顶点数组法绘制正六面体

    在今天的opengl的课程以及实验中,我们学习了如何使用顶点数组的方法来绘制图形,但相信还有很多同学对它的实际使用方法不太了解,我们就用我们今天实验课上的实例来简单讲解一下 题目及要求 绘制一个正六面 ...

  4. 剑指offer二十八之数组中出现次数超过一半的数字

    一.题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

  5. iOS开发技巧(系列十八:扩展UIColor,支持十六进制颜色设置)

    新建一个Category,命名为UIColor+Hex,表示UIColor支持十六进制Hex颜色设置. UIColor+Hex.h文件, #import <UIKit/UIKit.h> # ...

  6. Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)

    上一篇我们介绍了怎样由uri转换成String ,本文就用到了上篇文章的方法.以下我们介绍一下怎样设置头像后将头像图片上传到云端的方法,本文基于Bmob提供的服务. 看一下代码:(布局文件和前两篇文章 ...

  7. openGL线型和线宽以及线的抗锯齿

    openGL线型和线宽以及线抗锯齿 一. 线宽 Opengl的线宽设置:glLineWidth(width); width为float类型值,在0~10.0,大于10以上按10来处理. 若开启线的反走 ...

  8. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写

    实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...

  9. Unity QualitySettings.antiAliasing 抗锯齿

    QualitySettings.antiAliasing 抗锯齿 Description 描述 Set The AA Filtering option. 设置AA过滤选项. The AntiAliaz ...

随机推荐

  1. js判断是否微信客户端

    上周接到个需求,需求是这样的:用户扫一扫二维码会产生一个链接,该链接会向后端发送个请求,返回一个 apk 的下载地址,用户点击下载按钮可以下载此 apk.然后就发生了问题,经过测试,发现用微信扫一扫打 ...

  2. 将Sublime Text2 加入右键菜单

    在googleread里面看有人推荐sublime text2.说开发很方便.就下载一个试试.写html还真的挺爽. 于是按照vim加入鼠标右键的方法.果然可以.这里和大家分享 1. 运行中输入 re ...

  3. SQLServer重建索引

    Use [数据库名称]Go DECLARE @DBCCString NVARCHAR(1000)DECLARE @TableName VARCHAR(100)DECLARE Cur_Index CUR ...

  4. Android中密码输入内容可见性切换

    今天在做项目的时候遇到了一个关于密码输入框可见性切换问题,上网搜了搜,这里面门道还不小,做一个记录吧,下次遇到就好解决了. 首先写了一个简单的测试工程: <LinearLayout xmlns: ...

  5. Linux环境变量具体解释

    设置环境变量 profile和bashrc文件 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件.此文件为系统的每一个用户设置环境信息,当用户第一次登录时,该文件被运行. 并 ...

  6. Qt5.4.2编译 qtpropertybrowser-2.51(从4修改到5的除错过程)

    qtpropertybrowser是一个洛基亚时代的一个产物,其实它就是QtDesigner侧栏那种样子而已.网上大部分的都只适用于Qt4,今天头脑发热想用Qt5编译一下,发觉一大堆错误,因为Qt4有 ...

  7. Android 实现Xmpp工具类

    /** * XMPP服务器连接工具类. * * @author chen.lin * */ public class XmppManager { private static final String ...

  8. [TypeScript] Increase TypeScript's type safety with noImplicitAny

    TypeScript tries to infer as much about your code as it can. But sometimes there really is not enoug ...

  9. 十年磨一剑 Delphi再写传奇(不争辩,不解释,十年坚持不懈的努力)

    新年伊始,英巴卡迪诺公司(Embarcadero)就在其官网发布了“激动人心的RAD Studio2018年发展规划”公告(见上图).公告中指出,将在于2018年发布10.3.X新版本,新版本兼容Ex ...

  10. JS----checked----checked选中和未选中的获取

    , allValue.length - 1); allValue = allValue.replace(/[ ]/g, ""); var checkedIds = allValue ...