#include "stdlib.h"
#include <OpenGL/glext.h>
#include <GLUT/GLUT.h> #define BUFFER_OFFSET(bytes) ((GLubyte*) NULL + (bytes))
#define VERTICES 0
#define INDICES 1
#define NUM_BUFFERS 6
GLuint buffers[NUM_BUFFERS]; GLfloat vertices[][] = {
{-1.0f,-1.0f,-1.0f},
{1.0f,-1.0f,-1.0f},
{1.0f,1.0f,-1.0f},
{-1.0f,1.0f,-1.0f},
{-1.0f,-1.0f,1.0f},
{1.0f,-1.0f,1.0f},
{1.0f,1.0f,1.0f},
{-1.0f,1.0f,1.0f}
};
GLubyte indices[][] = {
{,,,},
{,,,},
{,,,},
{,,,},
{,,,},
{,,,}
}; GLfloat* bdata; void changeSize(int w, int h)
{
glViewport(,,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,(double)w/(double)h,0.01,);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} void keyDown(unsigned char key, int x, int y)
{
switch (key)
{
case'b':
bdata = (GLfloat*)glMapBuffer(GL_ARRAY_BUFFER,GL_READ_WRITE);
for (int i =; i <; i ++)
{
*(bdata + i) *=1.1f;
}
glUnmapBuffer(GL_ARRAY_BUFFER);
glutPostRedisplay();
break;
}
} void mouse(int button, int state, int x, int y)
{ }
void display(void)
{
glLoadIdentity();
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(30.0f,1.0f,1.0f,0.0f); // 6. 绘制, 这个地方注意的是最后一个参数,这个与普通的非VBO最大的不同就在这里
glDrawElements(GL_QUADS,,GL_UNSIGNED_BYTE,BUFFER_OFFSET());
//glDrawArrays(GL_TRIANGLE_FAN, 0, 8);
glutSwapBuffers();
} void init(void)
{
glClearColor(0.0f,0.0f,0.0f,0.0f);
glShadeModel(GL_FLAT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //1. 创建缓冲区对象,系统会自动创建缓动区标示符放入到buffers中,可以使用glIsBuffer()函数,判断一个标示符是否被使用
glGenBuffers(NUM_BUFFERS ,buffers);
//2. 激活缓冲区对象,绑定缓冲区对象表示未来选择的操作将影响哪个缓冲区。 如果要金融缓冲区对象,可以用0来作为缓冲区对象的标示符, 第一个参数target可以为GL_ARRAY_BUFFER,GL_ELEMENT_ARRAY_FUFFER
glBindBuffer(GL_ARRAY_BUFFER,buffers[VERTICES]);
//3. 用数据分配和初始化缓冲区对象
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_DYNAMIC_DRAW);
//4. 指定相对于缓冲区起始位置的偏移量
glVertexPointer(,GL_FLOAT,,BUFFER_OFFSET());
//5.一定不要忘记启动
glEnableClientState(GL_VERTEX_ARRAY); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,buffers[INDICES]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);
} int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GL_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(, );
glutCreateWindow("Buffer Demo");
init();
glutReshapeFunc(changeSize);
glutMouseFunc(mouse);
glutKeyboardFunc(keyDown);
glutDisplayFunc(display); glutMainLoop();
return ;
}

原文链接:OpenGL 通过VBO实现顶点数组绘制顶点

[转]OpenGL通过VBO实现顶点数组绘制顶点的更多相关文章

  1. openGL 提升渲染性能 之 顶点数组 VBO IBO VAO

    使用openGL图形库绘制,都需要通过openGL接口向图像显卡提交顶点数据,显卡根据提交的数据绘制出相应的图形. openGL绘制方式有:直接模式,显示列表,顶点数组,顶点索引. 直接模式:最简单, ...

  2. OpenGL(十八) 顶点数组和抗锯齿(反走样)设置

    顶点数组函数可以在一个数组里包含大量的与顶点相关的数据,并且可以减少函数的调用.使用顶点数组需要先启用顶点数组功能,使用glEnableClientState函数启用顶点数组,参数可以是GL_VERT ...

  3. OpenGL----绘制立方体,定点数组与顶点缓冲

    ,立方体是很简单,但是这里只是拿立方体做一个例子,来说明OpenGL在绘制方法上的改进.从原始一点的办法开始一个立方体有六个面,每个面是一个正方形,好,绘制六个正方形就可以了. glBegin(GL_ ...

  4. WebGL2系列之顶点数组对象

    使用了顶点缓冲技术后,绘制效率有了较大的提升.但是还有一点不尽如人意,那就是顶点的位置坐标.法向量.纹理坐标等不同方面的数据每次使用时需要单独指定,重复了一些不必要的工作.WebGL2提供了一种专门用 ...

  5. OpenGL中glVertex、显示列表(glCallList)、顶点数组(Vertex array)、VBO及VAO区别

    OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间 ...

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

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

  7. OpenGL顶点数组

    概述 作为在立即模式(glBegin()与glEnd()之间)下指定单个顶点数据的替代,你可以保存顶点数据在一组列表中,包括顶点位置.法线.纹理坐标与颜色信息.并且你可以通过索引数组解引用数组元素绘制 ...

  8. 3D Computer Grapihcs Using OpenGL - 19 Vertex Array Object(顶点数组对象)

    大部分OpenGL教程都会在一开始就讲解VAO,但是该教程的作者认为这是很不合理的,因为要理解它的作用需要建立在我们此前学过的知识基础上.因此直到教程已经进行了一大半,作者才引入VAO这个概念.在我看 ...

  9. OpenGL学习笔记2——顶点数组

    #pragma comment(lib,"glut32.lib") #pragma comment(lib,"glut.lib") #pragma commen ...

随机推荐

  1. NIO,AIO,BIO

    同步和异步:同步和异步关注的是消息通信机制, 同步:就是在发出一个“调用”时,在没有得到结果之前,该“调用”就不返回,但是一旦调用返回,就得到返回值了;换句话说:就是由“调用者”主动等待“调用”结果 ...

  2. HDU6186(线段树)

    CS Course Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. HDU4185(KB10-G 二分图最大匹配)

    Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  4. POJ2227(优先队列)

    The Wedding Juicer Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3440   Accepted: 155 ...

  5. 用node.js模拟服务器和客户端

    服务器 代码 var net = require("net") var server = net.createServer(); server.listen(12306," ...

  6. Flex 常用布局

    1.flex布局 1.1  容器指定为flex布局 .box{display: flex;} 1.2 行元素指定flex布局 .box{display:inline-flex} 2.容器的属性 2.1 ...

  7. JS中判断数据类型的几种方法

    1⃣️首先我们来了解一下js中的数据类型 1.基本数据类型:Undefined.Null.Boolean.Number.String(值类型) 2.复杂数据类型:Object(引用类型) (值类型和引 ...

  8. 快速配置webpack 4.x

    区分开发模式和生产模式: npm run start——开发模式,启用devServer,文件的改动实时更新.刷新 npm run build——生产模式,打包文件到dist文件夹 // packag ...

  9. bootstrap selectpicker 通过代码指定选中值 BootStrap selectpicker后台动态绑定数据 selectpicker 获取选中option的属性或者值

    bootstrap-select使用 bootstrap selectpicker 通过代码指定选中值 $('#subjectno').selectpicker('val',(row.subjectn ...

  10. Azure 中的虚拟网络和虚拟机

    创建 Azure 虚拟机 (VM) 时,必须创建虚拟网络 (VNet) 或使用现有的 VNet. 此外,还需要确定如何在 VNet 上访问 VM. 在创建资源之前必须做好规划,确保了解网络资源的限制. ...