opengl 你好三角形

OpenGl

目标:区分好VAO,VBO,EBO;懂得大致渲染管线的流程就可以了,会渲染简单的三角形

你好三角形

openGl有一套渲染管线,将3D的物体渲染到2D的平面上。在这个阶段我们只需要关注顶点着色器片段着色器
顶点着色器:将输入的顶点信息进行处理输出另一种坐标信息,该阶段要完成的任务有:将顶点信息存储到GPU,告诉GPU如何解释这些顶点,以及如何发到GPU。
第一个问题:如何快速将顶点发送到GPU,这就需要一个叫做顶点缓冲对象VBO的东西,管理这些顶点所在的内存。顶点缓冲是一个顶点缓冲类型,于是乎他就可以来存储顶点。使用gbindbuffer(GL_ARRAY_BUFFER,VBO),绑定缓冲类型,一旦绑定了缓冲类型,他就可以有对应类型的作用了,比如这里就是说它具有存储顶点的作用,现在啊,他就是一个容器。然后我们是不是应该往里边放东西了呢?接下来使用这个glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW),这个函数就是把数据给复制到这个缓冲(容器)中来,【这里仅仅解释最后一个参数,作用就是,我们放到这里边的数据是不是经常变,因为如果数据要是经常变我们就放到动态缓冲的地方,这样读写速度就会很快】。
片段着色器:、、、、、
当我们存到了gpu内存中,我们要告诉gpu如何对这些数据进行解释,

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);

注: VBO是管理内存的对象,可能会有多个VBO哦,因此我们必须在解释内存的时候告诉我们是要解释的是哪一段内存,也就是确定下来VBO,如何确定呢?就是通过glVertexAttribPointer()函数绑定的GL_ARRAY_BUFFER来决定,因为我们在之前是将一个VBO绑到了这里的缓冲类型,所以我们此处使用的已经绑定的VBO。
VAO:怎末说呢这东西真的我看了好久还是很迷糊,我简单理解下,VBO存的是顶点属性信息,像顶点位置啥的?VAO存的是啥,就是如何解释这些顶点信息的信息,比如像之前说的,在0位置,3个量长度,步长多少那种。这样的目的你想啊,它可以用来干啥呢?我不用每次都告诉这样解释了把,我下次直接搬出来VAO,他是不是直接就知道哦原来是这样解释的。
EBO:我们当用上边的流程绘制一个矩形的时候是不是,要绘制两个三角形,凑到一块才能绘制成一个矩形,那是不是有的边就会被重复绘制。

unsigned int VAO[2], VBO[2], EBO;
	glGenVertexArrays(2, VAO);
	glGenBuffers(2, VBO);
	glGenBuffers(1, &EBO);

	// 绑定VAO[0]并设置数据
	glBindVertexArray(VAO[0]);
	glBindBuffer(GL_ARRAY_BUFFER, VBO[0]);
	// 设置EBO的数据
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
	glEnableVertexAttribArray(0);
	// 绑定VAO[1]并设置数据
	glBindVertexArray(VAO[1]);
	glBindBuffer(GL_ARRAY_BUFFER, VBO[1]);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

	// 设置EBO的数据
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

	// 启用顶点属性数组
	glEnableVertexAttribArray(0);

注意: 看到上边代码了吗,这是多个VAO,VBO的共同作用的结果,然而这对我们关于绑定EBO,VBO到对应的VAO一定要小心谨慎,可能前一个VAO绑上了,后一个没有绑上,所以我在其中是不是就有一些这个重复的多个代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值