[转]OpenGL 通过VBO实现顶点数组绘制顶点

#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[][3] = {
    {-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[][4] = {
    {0,1,2,3},
    {4,7,6,5},
    {0,4,5,1},
    {3,2,6,7},
    {0,3,7,4},
    {1,5,6,2}
};  

GLfloat* bdata;  

void changeSize(int w, int h)
{
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0,(double)w/(double)h,0.01,30);
    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 =0; i <24; 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,24,GL_UNSIGNED_BYTE,BUFFER_OFFSET(0));
    //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(3,GL_FLOAT,0,BUFFER_OFFSET(0));
    //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(512, 512);
    glutCreateWindow("Buffer Demo");
     init();
    glutReshapeFunc(changeSize);
    glutMouseFunc(mouse);
    glutKeyboardFunc(keyDown);
    glutDisplayFunc(display);  

    glutMainLoop();
    return 0;
} 

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

原文地址:https://www.cnblogs.com/rainbow70626/p/9030509.html

时间: 2024-10-13 20:50:30

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

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

OpenGL中glVertex.显示列表(glCallList).顶点数组(Vertex array).VBO及VAO区别 1.glVertex 最原始的设置顶点方法,在glBegin和glEnd之间使用.OpenGL3.0已经废弃此方法.每个glVertex与GPU进行一次通信,十分低效. glBegin(GL_TRIANGLES); glVertex(0, 0); glVertex(1, 1); glVertex(2, 2); glEnd(); 2.显示列表(glCallList) 每个gl

OpenGL顶点数组

概述 作为在立即模式(glBegin()与glEnd()之间)下指定单个顶点数据的替代,你可以保存顶点数据在一组列表中,包括顶点位置.法线.纹理坐标与颜色信息.并且你可以通过索引数组解引用数组元素绘制选定的几何图元. 看看下面的用立即模式绘制立方体的代码. glBegin(GL_TRIANGLES); // draw a cube with 12 triangles // 前面 ================= glVertex3fv(v0); // v0-v1-v2 glVertex3fv(

【OpenGL 学习笔记04】顶点数组

通过之前的学习,我们知道,如果要绘制一个几何图形,那就要不断的调用绘制函数,比如绘制一个20条边的多边形,起码要调用22条函数(包含glBegin和glEnd). 所以OpenGL提供了一系列的顶点数组函数减少函数调用的次数来提高性能.而且使用顶点还可以避免顶点共享的冗余处理. 1.简单示例 先来回顾一下之前我们是怎么画直线的: void drawOneLine(GLfloat x1,GLfloat y1,GLfloat x2,GLfloat y2) { glBegin(GL_LINES); g

opengl学习笔记——顶点数组对象

1.创建顶点数组对象VAO void glGenVertexArrays(GLsizei n, GLuint * arrays); 返回n个当前未使用的名字,用作数组arrays中的顶点数组对象 GLvoid glBindVertexArray(GLuint array) 当使用的值array不是0并且是从glGenVertexArrays()返回的值时,创建一个新的顶点数组对象并且分配该名字.当绑定到之前创建的一个顶点数组对象的时候,该顶点数组对象变成活动的,这会影响到存储在该对象中的顶点数组

Android学习笔记&mdash;&mdash;OpenGL ES的基本用法、绘制流程与着色器编译

首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上,开发者可以使用跨平台应用编程接口创建二维或者三维图形,或进行图像处理和计算机视觉应用,结合两者将能构建丰富有趣的交互体验.前者称为OpenGL,后者称为OpenCV,不过本文主要介绍前者,OpenCV在后续文章中涉及.OpenGL应用于桌面系统的历史已经很长了,但考虑到移动平台的特点(计算能力.性能等),将

顶点数组以及解引用单个数组

法线向量 物体的法线向量定义了他的表面在空间中的方向.具体地说定义了他相对于光源的方向.OpenGL使用法线向量确定了这个物体各个顶点所接受的光照.在定义物体的几何形状时,同时也定义了他的法线向量.可以使用glNormal*()函数,把当前法线向量设置为这个函数所标示的值,以后调用glVertex*()时,就会把当前法线向量分配给所指定的顶点.每个顶点尝尝具有不同的法线,所以需要交替调用这个函数. glBegin(GL_POLYGON); glNormal3fv(n0); glVertex3fv

opengl基础学习专题 (三) 多边形绘制的几种样式

题外话 聪明人之所以不会成功,是由于他们缺乏坚韧的毅力. ——艾萨克·牛顿(1643年1月4日—1727年3月31日)英国 也许可以理解为 想更深一步的时候,坚持,努力和聪明缺一不可. 挺直腰杆在此向您致敬,愿您仍在天国 仍潇洒的思索着,奔跑着. 正文 在第二课中,我们学习了如何绘制几何图形,但大家如果多写几个程序,就会发现其实还是有些郁闷之处. 例如:点太小,难以看清楚:直线也太细,不舒服:或者想画虚线,但不知道方法只能用许多短直线,甚至用点组合而成. 这些问题将在本课中被解决. 下面就点.直

计算机图形学(二)输出图元_10_多边形填充区_8_OpenGL顶点数组

OpenGL顶点数组 尽管前面给出的例子中只包含少量的坐标位置,但描述包含若干个对象的场景一般会复杂得多.我们先考虑描述一个简单的很基本的对象:图3.58中的单位立方体,为简化后面的讨论而使用了整数坐标.定义顶点坐标的直接方法是用一个双下标数组,例如: GLint points [8][3] = {{0,0,0},{0,1,0},{1,0,0},{1,1,0},{0,0,1},{0,1,1},{1,0,1},{1,1,1}}; 也可以先定义一个三维顶点位置的数据类型,然后给出作为单下标数组元素的

OpenGL三角形的双面不同颜色的绘制

对于一个三角形,我要给它正反面不同的颜色.然后通过旋转,看出它的效果. 我只想到了2种方法,下面我来写一下这两种方法. 第一种方法,通过角度的判断重设glColor3f的参数(这种方法局限性很大,不推荐,不喜欢的可以直接跳过看第二种). 对于一个平面,我们知道,当它旋转到一定角度的时候,它就变成了一条线,那么,我们只要对这个角度进行一下判断就可以了. 下面是我的测试代码: #include <GL/glut.h> GLfloat yrot; //饶y轴旋转 void display() { g