1. Opengl中任何物体都是在3D空间中,而屏幕和窗口是2D,所以需要将3D坐标转为适用屏幕的2D像素
大概是如下一个管线(Pipeline)
2.
三角形顶点:
GLfloat vertices[] = { -0.5f, -0.5f,0.0f,0.5f, -0.5f,0.0f,0.0f,0.5f,0.0f};
VBO:顶点缓冲对象,会在GPU内存中存储大量顶点,使用的好处是可以一次性发送一大批数据到显卡上,
GLuint VBO;
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW);// 将数据复制到缓冲内存中
【
GL_STATIC_DRAW
:数据不会或几乎不会改变。GL_DYNAMIC_DRAW
:数据会被改变很多。GL_STREAM_DRAW
:数据每次绘制时都会改变。- 】
layout(location = 0)
定义了顶点属性——位置(Position)的位置值(Location)。这样要把顶点属性的位置值(Location)设置为0,因为我们希望把数据传递到这个顶点属性中,所以我们在这里填0。
vec3
类型,它由3个数值组成。
GL_FLOAT
(GLSL中
vec*
是由浮点数组成的)。
GL_TRUE
,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为
GL_FALSE
。
GLfloat
后面的位置,我们把步长设置为
3 * sizeof(GLfloat)
。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。每当我们有更多的顶点属性,我们就必须小心地定义每个顶点属性之间的空间(这个参数的意思简单说就是从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。
GLvoid*
的强制类型转换。它表示我们的位置数据在缓冲中起始位置的偏移量。由于位置数据是数组的开始,所以这里是0。我们会在后面详细解释这个参数。
使用:
(1)复制顶点数组到缓冲中给opengl使用
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW);
(2)设置顶点属性
glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);
(3)使用着色器
glUseProgram(shaderProgram);
//
3. opengl3.0 支持VAO[顶点数组对象]
一个顶点数组对象储存下面的内容:
- 调用
glEnableVertexAttribArray
和glDisableVertexAttribArray
。 - 使用
glVertexAttribPointer
的顶点属性配置。 - 使用
glVertexAttribPointer
进行的顶点缓冲对象与顶点属性链接。

生成VAO:
GLuint VAO;glGenVertexArrays(1, &VAO);
// ..:: 初始化代码 (一次完成 (除非你的物体频繁改变)) :: ..
// 1. 绑定VAO
glBindVertexArray(VAO);
// 2. 把顶点数组复制到缓冲中提供给OpenGL使用
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW);
// 3. 设置顶点属性指针
glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid * )0);
glEnableVertexAttribArray(0);
//4. 解绑VAO
glBindVertexArray(0);
[...]
// ..:: 绘制代码 (in Game loop) :: ..
// 5. 绘制物体
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES,0,3);
glBindVertexArray(0);
4. IBO或EBO
GLfloat 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// 左上角};
GLuint indices[] = { // 起始于0!0,1,3,// 第一个三角形1,2,3// 第二个三角形};
GLuint IBO;
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices), indices, GL_STATIC_DRAW);
//绘制
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_INT, 0);
5.线框模式
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)