#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. POJ2406(SummerTrainingDay10-I KMP)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 50036   Accepted: 20858 D ...

  2. JavaScript高级编程——引用类型、Array数组使用、栈方法

    JavaScript高级编程——引用类型.Array数组使用.栈方法 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999 ...

  3. Mysql实现级联操作(级联更新、级联删除)

    一.首先创建两张表stu,sc create table stu( sid int UNSIGNED primary key auto_increment, name ) not null) TYPE ...

  4. vue-scroller记录滚动位置

    问题描述: 列表页进入详情页,或者tab页切换,然后再返回列表页,希望能切换到之前滚动位置 解决问题思路: 切换到其他页面前记录位置,返回列表页的时候返回位置.这就需要借助vue-router的bef ...

  5. html垂直居中

    参考于http://www.cnblogs.com/yugege/p/5246652.html <!DOCTYPE html> <html lang="en"&g ...

  6. ArcGIS三种方式打断相交线------Feature To Line工具

    有多个layer图层相交线时,选用”Feature To Line“工具,将多个图层相交线打断,然后合并成一个图层. (1)       选择工具栏”Geoprocessing“中的”ArcToolb ...

  7. 测试sql server服务是否配置正确

    最简单的方法: 新建一个testdb.udl文件,双击可出现测试界面

  8. create-react-app脚手架的安装和目录结构介绍

    1.对脚手架的初步了解 编程领域中的“脚手架”指的是能够快速搭建项目“骨架”的一类工具,例如大多数的React项目都有src,public,webpack配置文件等等,而src目录中又包含compon ...

  9. Linux 同步时间 设置时区

    简化版 同步时间 #直接用域名同步中国上海时间 ntpdate -u ntp.api.bz # hwclock --hctosys 或者 # clock --hctosys hc代表硬件时间,sys代 ...

  10. Oracle EBS OPM 查询现有量

    --查询现有量 --created by jenrry DECLARE p_inventory_item_id NUMBER := 231652; --NOT NULL p_organization_ ...