Example 1 - Index Buffer
- Reuse existing vertices.
重用缓冲区的顶点
1.1 Source Code
// 顶点信息
float positions[] = {
0.0f, 1.0f, // 0
0.5f, 0.0f, // 1
-0.5f, 0.0f, // 2
0.0f,-1.0f // 3
};
// 索引数组
unsigned int indices[] = {
0, 1, 2, // 第一个三角形顶点索引
2, 3, 1 // 第二个三角形顶点索引
};
/* 顶点缓存 */
// 缓存id
GLenum bufferId;
// 申请缓存
glGenBuffers(1, &bufferId);
// 选择当前缓存
glBindBuffer(GL_ARRAY_BUFFER, bufferId);
// 缓存中的数据赋值
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), &positions, GL_STATIC_DRAW);
// 启用(状态机的)顶点属性
glEnableVertexAttribArray(0);
// 设置顶点的布局,第一个参数为属性索引,对应glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
// 启用(状态机的)顶点属性
glEnableVertexAttribArray(0);
// 设置顶点的布局,第一个参数为属性索引,对应glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);
/* 索引缓存 */
GLenum indexBufferObject;
glGenBuffers(1, &indexBufferObject);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), &indices, GL_STATIC_DRAW);
1.2 Notes
- 使用indexBuffer前需先将顶点存入缓存中。
- glDrawArrays(GL_TRIANGLES, 0, 3);改成glDrawElements(GL_TRIANGLES, sizeof(indices), GL_UNSIGNED_INT, nullptr);
Example 2 - Uniform
1.1 Source Code
/* 定义Uniform */
int uniformLocation = glGetUniformLocation(shaderProgram, "u_color");
assert(uniformLocation != -1);
glUniform4f(uniformLocation, 0.5f, 0.5f, 0.5f, 1.0f);