VAO详解

1.定义:

顶点数组对象是一种OpenGL对象,它存储提供顶点数据所需的所有状态。VAO仅引用缓冲区。

2.具有的功能:

作为OpenGL对象,VAO具有通常的创建,销毁和绑定功能:glVertexArrays,

glDeleteVertexArrays和glBindVertexArray(VAO只有一个目标)。

引用:Vertex Specification - OpenGL Wiki

顶点属性的编号从0到GL_MAX_VERTEX_ATTRIBS-1。可以启用或禁用每个属性以进行数组访问。当属性的数组访问被禁用时,顶点着色器对该属性的任何读取都将产生一个常量值。

新创建的VAO禁用了所有属性的数组访问。需要通过绑定相关的VAO调用来启用数组访问。glEnableVertexAttribArray(GLunit index)

ps:调用这些函数时必须绑定VAO,并由这些函数引起的任何更改都将被VAO捕获。

3.VAO记录了

1.vertex attribute的格式,由glVertexAttribPointer设置。

2.vertex attribute 对应的VBO的名字,由一对glBindBuffer和glVertexAttribPointer设置。

3.当前绑定的GL_ELEMENT_ARRAY_BUFFER的名字,由glBindBuffer设置。

VAO中并不保存当前绑定的GL_ARRAY_BUFFER,VBO和vertex attribute的绑定是在glVertexAttribPointer中完成的。

4.使用VAO前后对比

原来调用一次drawcall要执行

1.绑定shader

2.绑定vertex buffer

3.指示其layout 

4.绑定index buffer

5.调用drawcall


现在变成了

1.绑定shader

2.绑定vertex array

3.调用drawcall

即用vertex array object 包含vertex buffer和layout 这些状态。

5.关键代码

	float positions[] = {
		-0.5f,-0.5f,
		 0.5, -0.5f,
		 0.5f, 0.5f,
		 -0.5f,0.5f
	};
	unsigned int indices[] =
	{
		0,1,2,
		2,3,0
	};

	unsigned int VAO,VBO;
	glGenVertexArrays(1, &VAO);
	glBindVertexArray(VAO);

	glGenBuffers(1, &VBO);
	glBindBuffer(GL_ARRAY_BUFFER, VBO);
	glBufferData(GL_ARRAY_BUFFER, 6 * 2 * sizeof(float), positions, GL_STATIC_DRAW);

	glEnableVertexAttribArray(0);
	glVertexAttribPointer(0,2,GL_FLOAT,GL_FALSE,8,(const void*)0);

	unsigned int IBO;
	glGenBuffers(1, &IBO);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned int), indices, GL_STATIC_DRAW);

	ShaderProgramSource source = ParseShader("res/shaders/Basic.shader");
	unsigned int shader = CreateShader(source.VertexSource,source.FragmentSource);
	glUseProgram(shader);
	
	while (!glfwWindowShouldClose(window))
	{
		glClear(GL_COLOR_BUFFER_BIT);
		GLCall(glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT,nullptr));
		glfwSwapBuffers(window);
		glfwPollEvents();
	}

	glDeleteProgram(shader);
	glfwTerminate();
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘敬_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值