OpenGL 基础概念
参考资料
# NDC 标准化坐标
Nornalized Device Coordinate
-1 至 1 之间 本质上是 '比例' 关系
屏幕像素: 800(w)*600(h) 横坐标: -1=0像素 0=400像素 1=800像素 纵坐标: -1=0像素 0=300像素 1=600像素
例子: (0.3, 0.2) => (400*(1+0.3), 300*(1+0.2)) => (520, 360); (-0.4, -0.3) => (400*(1-0.4), 300*(1-0.3)) => (240, 210)
// NDC 坐标
float vertices[] = {
-0.5f, -0.5f, 0.0f, // 第一个点 x, y, z z坐标表示距离镜头的深度
0.5f, -0.5f, 0.0f, // 第二个点
0.0f, 0.5f, 0.0f // 第三个点
}
# VBO(vertex buffer object
)
VBO 顶点缓存
buffer object 内存描述对象
glGenBuffers(GLsiei n, GLuint *buffers) 创建 n个vbo
glDeleteBuffers(GLsiei n, GLuint *buffers) 销毁 n个vbo
glBindBuffer(GLenum target, Gluint buffer) 绑定vbo
glBufferData(GLenum target, GLsizeiptr size, const void *data, GLenum usage) vbo填入数据, 真正开辟显存
GL_CALL() 检查OpenGL是否有错误
单属性数据 SingleBuffer 位置、颜色
// 位置vbo
float positions[] = {
-0.5f, -0.5f, 0.0f, // 第一个点坐标
0.5f, -0.5f, 0.0f, // 第二个点
0.0f, 0.5f, 0.0f // 第三个点
}
// 颜色vbo
float colors[] = {
0.1f, 0.1f, 0.5f, // 第一个点颜色 r, g, b
0.7f, 1.0f, 0.3f, // 第二个点
0.2f, 0.3f, 0.6f // 第三个点
}
// 每个vbo都要单独绑定
GLuint posVbo = 0;
GLuint colVbo = 0;
GL_CALL(glGenBuffers(1, &posVbo));
GL_CALL(glGenBuffers(1, &colVbo));
// 绑定位置vbo
GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, posVbo));
// 传递位置数据
GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW));
// 绑定颜色vbo
GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, colVbo));
// 传递颜色数据
GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW));
多属性数据 InterleavedBuffer (交叉存储, 数据是交叉的)
// 位置+颜色vbo
float positionsAndColors[] = {
-0.5f, -0.5f, 0.0f, 0.1f, 0.1f, 0.5f, // 第一个点坐标+颜色
0.5f, -0.5f, 0.0f, 0.7f, 1.0f, 0.3f, // 第二个点
0.0f, 0.5f, 0.0f, 0.2f, 0.3f, 0.6f // 第三个点
}
// 1.创建一个vbo
GLuint vbo = 0;
GL_CALL(glGenBuffers(1, &vbo));
// 2.绑定一个vbo
GL_CALL(glBindBuffer(GL_ARRAY_BUFFER, vbo));
// 3.vbo填入数据
GL_CALL(glBufferData(GL_ARRAY_BUFFER, sizeof(positionsAndColors), positionsAndColors, GL_STATIC_DRAW));
# VAO(vertex array object
)
VAO 顶点数组 储存的是描述信息
glGenVertexArrays(GLsiei n, GLuint *arrays) 创建 n个vao
glDeleteVertexArrays(GLsiei n, GLuint *arrays) 删除 n个vao
glBindVertexArray(Gluint array) 绑定vao
glEnableVertexAttribArray(GLunit vaoIndex) 激活第 vaoIndex 下标的vao(例子: glEnableVertexAttribArray(0)位置属性放在vao属性的0号位置, 要先激活)
!!! VAO加入VBO描述 !!!
例子:
index vao 的下标, 位置属性
size 一个属性三个数字
type 数据类型
normalized 非归一化
stride 顶点数据跨度步长
*pointer 顶点数据内部偏移
void glVertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride const void *pointer)