1、顶点缓冲区:本质上是GPU上的一段显存,主要用来存储顶点数据(包括了顶点属性);
2、顶点数组:顶点数组的数据需要被复制到顶点缓冲区,它是顶点缓冲区对象的基础,所以要在顶点缓冲区之前创建
3、顶点属性数组:是顶点数组的一种表现形式,对每个顶点指定属性。所以顶点属性数组要在顶点数组之前创建。那么我们可知以下创建顺序:
顶点数组创建->顶点缓冲区创建->顶点属性数组创建。
那来一段代码看看究竟如何:
float positions[] = {//在cpu上的顶点数据,包括了顶点的位置和顶点的纹理
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
0.5f, -0.5f, -0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 1.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
0.5f, -0.5f, -0.5f, 1.0f, 1.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
0.5f, -0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,
0.5f, 0.5f, -0.5f, 1.0f, 1.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
0.5f, 0.5f, 0.5f, 1.0f, 0.0f,
-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,
-0.5f, 0.5f, -0.5f, 0.0f, 1.0f
};
//创建的着色器对象,太阳与被照射的物体
GLCall(Shader light("Basic.shader1"););
GLCall(Shader objector("Basic.shader"));
//创建的两个顶点数组,一个是太阳,一个是被照射的物体
unsigned int CubeColor, LightColor;
GLCall(glGenVertexArrays(1, &CubeColor););
//创建的顶点缓冲区
unsigned int buffer;
GLCall(glGenBuffers(1, &buffer););
GLCall(glBindBuffer(GL_ARRAY_BUFFER, buffer););
GLCall(glBufferData(GL_ARRAY_BUFFER, 36 * 5 * sizeof(float), positions, GL_STATIC_DRAW););
GLCall(glBindVertexArray(CubeColor););
//创建的顶点属性数组
GLCall(glEnableVertexAttribArray(0););
GLCall(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (const void*)0););
GLCall(glEnableVertexAttribArray(1););
GLCall(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (const void*)(3 * sizeof(float))););
GLCall(glGenVertexArrays(1, &LightColor););
GLCall(glBindBuffer(GL_ARRAY_BUFFER, buffer););
GLCall(glBufferData(GL_ARRAY_BUFFER, 36 * 5 * sizeof(float), positions, GL_STATIC_DRAW););
GLCall(glBindVertexArray(LightColor););
GLCall(glEnableVertexAttribArray(0););
GLCall(glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (const void*)0););
GLCall(glEnableVertexAttribArray(1););
GLCall(glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (const void*)(3 * sizeof(float))););
GLCall(Texture texture1("D:\\c++\\自己写箱子\\texture\\container.jpg"););
GLCall(Texture texture2("D:\\c++\\自己写箱子\\texture\\awesomeface.png"););
其实我这里是创建了两个图形对象,看看最后效果如何: