OpenGl中的顶点缓冲区、顶点数组、顶点属性数组的关系(修正)

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"););

其实我这里是创建了两个图形对象,看看最后效果如何:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值