这次要用到glew库,还将使用顶点缓冲器(VBO). 1.#include <GL/glew.h> :GLEW扩展库,注意glew.h必须要写在前面,否则会编译出错 2.#include “ogldev_math_3d.h” : 用于OpenGL的3d数学库,这里主要用到了顶点这个数据结构,里面报错的代码可以先注释掉,可以在网上下载到这个库。 3.

// 检查GLEW是否就绪,必须要在GLUT初始化之后!
GLenum res = glewInit();
if (res != GLEW_OK) {
fprintf(stderr, “Error: ‘%s’\n”, glewGetErrorString(res));
return 1;
}

4.Vector3f Vertices[1]:创建含有一个顶点的顶点数组 Vertices[0] = Vector3f(0.0f, 0.0f, 0.0f):将点置于屏幕中央 5.GLuint VBO:全局GLuint引用变量,来操作顶点缓冲器对象 6.glGenBuffers(1, &VBO): 创建缓冲器 第一个参数用来定义你想创建的对象的数量,第二个参数是一个GLuint变量的数组的地址,来存储分配给你的引用变量handles 7.glBindBuffer(GL_ARRAY_BUFFER, VBO):绑定GL_ARRAY_BUFFER缓冲器 目标名GL_ARRAY_BUFFER意思是这个buffer将存储一个顶点的数组 8.glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW):绑定顶点数据 这个回调函数取得我们之前绑定的目标名参数GL_ARRAY_BUFFER,还有数据的比特数参数,顶点数组的地址,还有一个表示这个数据模式的标志变量。因为我们不会去改变这个buffer的内容所以这里用了GL_STATIC_DRAW标志,相反的标志是GL_DYNAMIIC_DRAW 9.glEnableVertexAttribArray(0):开启顶点属性 加载到buffer中的顶点位置在固定功能管线中是被认为是索引为0的顶点属性(当没有着色器绑定时被启用)。 10.glBindBuffer(GL_ARRAY_BUFFER, VBO):绑定GL_ARRAY_BUFFER缓冲器 再次绑定我们的buffer准备开始draw call回调 11.glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0):管线解析bufer中的数据 第1个参定义了属性的索引,再这个例子中我们知道这个索引默认是0 第2个参数指的是属性中的元素个数(3个表示的是:X,Y,Z坐标); 第3个参数指的是每个元素的数据类型; 第4个参数指明我们是否想让我们的属性在被管线使用之前被单位化,我们这个例子中希望我们的数据保持不变的被传送; 第5个参数(称作’stride‘)指的是缓冲中那个属性的两个实例之间的比特数距离。 第6个参数是我们需要在管线发现我们的属性的地方定义数据结构中的内存偏移值。在有位置数据和法向量数据的结构中,位置的偏移量为0,而法向量的偏移量则为12。 12.glDrawArrays(GL_POINTS, 0, 1):开始绘制几何图形(绘制一个点) 这个指令才是GPU真正开始工作的地方。这个指令将整合这个指令收到的绘制参数和之前为这一个点的图形建立的状态数据来将结果渲染在屏幕上。 13.glDisableVertexAttribArray(0):禁用顶点数据 当顶点短时间内不会被使用的时候及时禁用他们 代码如下:

#include <stdio.h>
#include <GL/glew.h> // GLEW扩展库,注意glew.h必须要写在前面
#include <GL/freeglut.h> // freeGLUT图形库
#include “ogldev_math_3d.h” //用于OpenGL的3d数学库,这里主要用到了顶点这个数据结构,里面报错的代码可以先注释掉

GLuint VBO; //全局GLuint引用变量,来操作顶点缓冲器对象

//渲染回调函数
static void RenderCallBack()
{
glClear(GL_COLOR_BUFFER_BIT); //清空颜色缓存

glEnableVertexAttribArray(0);    //开启顶点属性
glBindBuffer(GL\_ARRAY\_BUFFER, VBO);        //绑定GL\_ARRAY\_BUFFER缓冲器
glVertexAttribPointer(0, 3, GL\_FLOAT, GL\_FALSE, 0, 0);    // 管线解析bufer中的数据

glDrawArrays(GL\_POINTS, 0, 1);     //开始绘制几何图形(绘制一个点)
glDisableVertexAttribArray(0);      //禁用顶点数据
glutSwapBuffers();    //交换前后缓存

}

//创建顶点缓冲器
static void CreateVertexBuffer()
{
Vector3f Vertices[1]; //创建含有一个顶点的顶点数组
Vertices[0] = Vector3f(0.0f, 0.0f, 0.0f); //将点置于屏幕中央

glGenBuffers(1, &VBO);    //创建缓冲器
glBindBuffer(GL\_ARRAY\_BUFFER, VBO);      //绑定GL\_ARRAY\_BUFFER缓冲器

glBufferData(GL\_ARRAY\_BUFFER, sizeof(Vertices), Vertices, GL\_STATIC\_DRAW);     //绑定顶点数据

}

//入口函数
int main(int argc, char ** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA); //显示模式:双缓冲、RGBA

glutInitWindowSize(400, 400);     
glutInitWindowPosition(100, 100); 
glutCreateWindow("这是一个顶点");  

glutDisplayFunc(RenderCallBack);    //开始渲染

// 检查GLEW是否就绪,必须要在GLUT初始化之后!
GLenum res = glewInit();
if (res != GLEW\_OK) {
    fprintf(stderr, "Error: '%s'\\n", glewGetErrorString(res));
    return 1;
}

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);    //缓存清空后的颜色值
CreateVertexBuffer();    //创建顶点缓冲器
glutMainLoop();      //通知开始GLUT的内部循环

return 0;

}

结果如下: 参考链接: http://ogldev.atspace.co.uk/www/tutorial02/tutorial02.html http://blog.csdn.net/cordova/article/details/52491762