OpenGL 入门2

原帖地址:http://ogldev.atspace.co.uk/www/tutorial02/tutorial02.html
http://blog.youkuaiyun.com/cordova/article/details/5249176
http://ogldev.atspace.co.uk/www/tutorial03/tutorial03.html
http://blog.youkuaiyun.com/cordova/article/details/52494549

OpenGL 中的顶点

glew

我们将会使用一个叫glew的库,这个库会帮助我们更轻松的管理opengl扩展。每当glew被初始化之后,它就会动态的加载当前系统中可用的opengl扩展,并且通过一个简单的头文件来提供快捷方便的访问。

VBO

VBO(vertex buffer object),顾名思义,这是一个用于存储顶点信息的缓存。所有3D世界中的怪物,建筑等都是由一个一个的顶点连接起来组成的。VBO是将顶点信息传给GPU的最快的方式,因为VBO是可以存在于显卡缓存上的。

API

GLenum glewInit();

用于初始化glew,如果初始化失败GLenum的值就不会是GLEW_OK。

GLfloat vertices[3][3] = {{0.0,1.0,0.0},
                          {-1.0,0.0,0.0},
                          {1.0,0.0,0.0}};

初始化我们需要用到的顶点。

GLuint vbo;
glGenBuffer(1,&vbo);

opengl定义了很多中glGen*类型的函数用于分配不同类型的句柄。第一个参数标明分配的句柄的数量,第二个参数是一个数组的地址,数组中存储的是句柄。如果一个句柄没有被glDeleteBuffers函数删除,那么opengl就不会分配一个相同的句柄出来。在这里我们只是分配了句柄,相当于c语言中的指针。在这个句柄没有绑定具体的对象之前是不能使用的,就相当于c语言中的空指针,我们不能使用它来进行函数调用。

glBindBuffer(GL_ARRAY_BUFFER,vbo);

OpenGL有一种与众不同的使用句柄的技巧。在其他的API中,句柄通常被用做一个参数在各个相关的函数之间传递,并且通常会对这个句柄做一些处理。在OpenGL中,我们会将多个句柄绑定到一个target上,然后通过在target上执行命令来影响绑定到target上的句柄。当我们想要解除这种绑定关系可以用另外的句柄来替换当前绑定的句柄,又或者是将以上参数的句柄设置为0。GL_ARRAY_BUFFER意味这我们将这个叫做vbo的句柄,指向了一个缓存。另一个有用的target是GL_ELEMENT_ARRAY_BUFFER意味着vbo指向的是一个索引缓存。当我们第一次绑定对象的时候,OpenGL内部会分配这个对象所需的内存并且将它作为当前对象,即所有后继的操作都会作用于这个被绑定的对象。一般说来有两种情况我们需要绑定对象,一是创建对象并初始化它所对应的数据时;二是每次我们准备使用这个对象,而它并不是当前绑定的对象时。

glDeleteBuffer(vbo);
glBindBuffer(0);

既然有绑定,那么就有解绑。解绑有两种方式,glDeleteBuffer()和glBindBuffer()。前者将当前vbo置为0且将vbo所指向的对象也清楚,后者只是将当前绑定对象的vbo置为0,但此vbo指向的对象依然在,且编程默认渲染状态。

glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);

这个函数的作用是向我们的缓存里面加载顶点数据。第一个参数是我们的顶点缓存,第二个参数是传入的顶点信息的大小,第三个参数是传入的顶点信息的起始地址,第四个参数表明我们不会改变顶点缓存中的内容,与之对应的则是GL_DYNAMIC_DRAW。

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

这个函数的功能是设定我们如何从buffer里面挑出我们需要的数据送入shader中。第一个参数是一个索引,这个索引与shader中layout所使用的索引一一对应。此例中,shader中layout对应的索引是location = 0,所以我们这里的索引值是0。第二个和第三个参数代表我们传入的数据是怎么构成的,在这里我们传入的数据是位置信息,而位置信息由3个float类型的数据组成。第四个参数设置我们传入的数据是否进行归一化。第五个参数设置我们传入的数据之间的间隔,第六个参数设置传入的数据开始时的地址,我们是从buffer的最开始传入数据的,所以设置为0。
假如我们传入的数据包括3个float的位置信息以及3个float的法线信息。那这些数据vertex buffer中的存在方式就像下图:
这里写图片描述
那么我们第五个参数应该设置为12,因为位置信息之间隔了3个float类型的法线信息,而一个float是4个字节,那么三个float就是12个字节。

glEnableVertexAttribArray(0);

在设置完传入的数据之后,我们要让与这个索引相关联的顶点数组能够被shader使用,这个时候就需要使用这个函数,传入的参数,就是这个将要在shader中被使用的且设置好的索引。

glDrawArrays(GL_POINTS, 0, 1);

这个函数的作用是设定用哪些顶点画出那种图元。第一个参数设定图元,第二个参数设定起始顶点索引值,第三个参数设定使用的顶点数量。

glDisableVertexAttribArray(0);

当渲染完成之后,记得把顶点属性数组重置一下。因为当没有shader使用某个属性时依然保留AttibPointer感觉怪怪的。

查看当前的opengl版本

    const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
    const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
    const GLubyte* OpenGLVersion =glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
    const GLubyte* gluVersion= gluGetString(GLU_VERSION); //返回当前GLU工具库版本
    printf("OpenGL实现厂商的名字:%s\n", name);
    printf("渲染器标识符:%s\n", biaoshifu);
    printf("OpenGL实现的版本号:%s\n",OpenGLVersion );
    printf("OGLU工具库版本:%s\n", gluVersion);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值