OpenGL 系列分享目的在于介绍如何使用 OpenGL 来绘制画面。 为了大家能够更好理解如何开发游戏引擎做一些准备工作,同时也推出了C++ 基础分享,此分享也为游戏引擎开发分享服务。在之前我们已经在屏幕上绘制了一个三角形,普及一下,我们在玩游戏和看CG 动画的时候,所有的绚丽的画面都是由若干三角形组成。所以,一切的一切都是从三角形开始,那么 OpenGL 是怎么流程将三角形绘制到屏幕上,首先需要 vertex buffer 和 vertex shader。
那么我们就从 vertex buffer 开始,vertex buffer 这个词便于理解,大家可以先不用考虑 vertex ,就只想他就是一个 buffer,占一定字节的内存。大家都是在 C++ 也有像 char 这样类型 buffer,这里 vertex buffer 与之不同之处在于这里buffer 是占用的 GPU 的内存而不是 CPU 的内存。当我们要画三角形到画面时,绘制方法会从 GPU 的 ram 读取 buffer(顶点信息) 进行绘制。Shader 是一段代码计算出位置,运行这段代码可以绘制图形。
我们需要把之前绘制三角形顶点的数据转移到到openGL 的 buffer 中,作为绘制的数据。也就是创建缓存区对象。
我们定义缓存 buffer,这里第一个参数为定义 buffer 个数,1 表示我定义一个 buffer。
第二个为用于存储单一 ID 或多个 ID 的 GLuint (unsigned int)变量或数组的地址,这里个人推荐使用 unsigned int 类型代替 openGL 提供的 GLunit ,返回缓存对象的标示符),可以想象为一个对象 id,shader 可以根据 id 获取对象。
我们定义一个数组包含三角形顶一点的数据,
在使用 buffer 对象之前,需要将 buffer 对象绑定(连接)到相应的缓存上。glBindBuffer()有2个参数,分别为目标与buffer。
第一个参数(目标)告诉 VBO 该缓存对象将保存顶点数组数据还是索引数组数据:GL_ARRAY_BUFFER 或 GL_ELEMENT_ARRAY。任何顶点属性,如顶点坐标、纹理坐标、法线与颜色分量数组都使用GL_ARRAY_BUFFER。
如何使用 openGL 方法,可以 docs.gl 网址进行搜索
可以使用glBufferData()将数据拷贝到缓存对象,第一个参数(目标)可以为GL_ARRAY_BUFFER 或 GL_ELEMENT_ARRAY, 这里为 GL_ARRAY_BUFFER 。size(图中的 6)为待传递数据字节数量。第三个参数(图中的 position)为源数据数组指针,如 data 为 NULL,则 VBO 仅预留给定数据大小的内存空间。最后一个参数usage标志位VBO的另一个性能提示,它提供缓存对象将如何使用:static、dynamic 或 stream、与 read、copy 或 draw。这里用 GL_STATIC_DRAW 表示仅需修改一次,可以多次使用。
删除之前绘制三角形的方法,我们现在是 openGL 编程,我们 glDrawArrays 绘制,第一参数为绘制图形类型,第二个参数从 buffer 数据第一位开始绘制,第三表示绘制个数,因为是三个顶点,所以为 3.。运行程序没有效果,因为我们还没有定义 shader。
网友评论