标准化设备坐标
(normalized Device Coordinates,NDC)顶点着色器中处理过后,就应该是标准化设备坐标了。x,y和z的值在-1.0到1.0的一小段空间。落在范围之外的坐标都会被裁剪。
绘制三角形
以下代码我们就可以得到三角形的三个顶点
float vertices[]= {
-0.5f,-0.5f,-0.0f,
0.5f,-0.5f,-0.0f,
-0.5f,0.5f,-0.0f
}
layout (location=0) in vec3 aPos;
void main(){
gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);
}
顶点着色器:
-
他会在GPU上面创建内存,用于存储我们的顶点数据。
- 通过顶点缓冲对象(Vertex Buffer Objects,VBO管理),顶点缓冲对象的缓冲类型是GL_ARRAY_BUFFER
-
配置OpenGL如何解释这些内存。
- 通过顶点数组对象(Vertex Array Objects,VAO)来进行管理。数组里面的每一个贞都代表一个属性的解析。
提示:OpenGL允许我们同时绑定多个缓冲,只要他们是不同的缓冲类型(每一个缓冲类型类似于我们前面说的子集。每个VBO是一个小助理)VAO并不保存实际数据。而是存放顶点结构定义。
代码实现
// 创建VBO和VAO对象,并赋予ID
unsigned int VBO,VAO;
glGenVertexArrays(1,&VAO);
glGenBuffers(1,&VBO);
// 绑定VBO和VAO对象
glBindVertexArray(VAO);
glBindBUffer(GL_ARRAY_BUFFER,VBO);
//为当前绑定到target的缓冲区对象创建一个新的数据存储
//如果data不是NULL,则使用来自此指针的数据初始化数据存储
void glBufferData(GLenum target,GLsizeiptr size,const GLvoid* data,GLenum usage)
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
// 告知显卡如何解析缓冲里面的属性值
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void*)(0));
// 开启VAO管理的第一个属性值
glEnableVertexAttribArray(0);