OpenGL创建三角形的流程
基础概念
顶点数据
我们在创建一个最基本的几何体时必须要告诉GPU要渲染的几何体的基本信息,包括顶点的坐标,颜色,法线,贴图等等,这些信息全部保存至数组当中,在使用的时候需要将这些数据传入顶点着色器。示例如下:
//顶点信息
float vertices[] = {
0.5f, 0.5f, 0.0f, // 右上角
0.5f, -0.5f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
两个三角形,有两个公共顶点,这时用到EBO
float vertices[] = {
// positions // texture coords
0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // top right
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, // bottom right
-0.5f, -0.5f, 0.0f, 0.0f, 0.0f, // bottom left
-0.5f, 0.5f, 0.0f, 0.0f, 1.0f // top left
};
带有颜色信息
float vertices[] = {
// 位置 // 颜色
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // 右下
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // 左下
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // 顶部
};
VAO,VBO及EBO
-
顶点数组对象:Vertex Array Object,VAO
-
顶点缓冲对象:Vertex Buffer Object,VBO
-
索引缓冲对象:Element Buffer Object,EBO或Index Buffer Object,IBO
使用说明
顶点数组对象即为顶点数据,顶点缓冲对象用来管理顶点数据的,需要VBO存在的原因如下:
我们通过顶点缓冲对象(Vertex Buffer Objects, VBO)管理这个内存,它会在GPU内存(通常被称为显存)中储存大量顶点。使用这些缓冲对象的好处是我们可以一次性的发送一大批数据到显卡上,而不是每个顶点发送一次。从CPU把数据发送到显卡相对较慢,所以只要可能我们都要尝试尽量一次性发送尽可能多的数据。当数据发送至显卡的内存中后,顶点着色器几乎能立即访问顶点,这是个非常快的过程。简而言之就是为了通过它加快数据传输速度。
索引缓冲对象存在的原因是当顶点数据发生重合时会造成不必要的内存浪费,而当引入索引缓冲对象时就可以大量减少这类空间的浪费,节约内存。
例如,当我们要绘制两个三角形,但是这两个三角形有公共顶点时:
//顶点信息
float vertices[] = {
0.5f, 0.5f, 0.0f, // 右上角
0.5f, -0.5f, 0.0f, // 右下角
-0.5f, -0.5f, 0.0f, // 左下角
-0.5f, 0.5f, 0.0f // 左上角
};
unsigned int indices[] = {
// 注意索引从0开始!
0, 1, 3, // 第一个三角形,对应数组的第1,2,4行
1, 2, 3 // 第二个三角形,对应数组的第2,3,4行
};
使用indices数组就是索引缓冲对象

本文详细介绍了使用OpenGL绘制三角形的全过程,从顶点数据准备、VAO/VBO/EBO的使用,到顶点着色器与片元着色器的创建与链接,最后展示了一个完整的代码示例。
最低0.47元/天 解锁文章
349

被折叠的 条评论
为什么被折叠?



