1-2 VAO与VBO

前言

本节介绍VAO 和 VBO

简写展开
VAOVertex Array Object
VBOVertex Buffer Object
  1. Vertex 都是顶点 对[结构体数组]中其中一个对象的称呼
  2. 都是对象Object --> glGenXXX(纯数字id-对象)

最终要实现:画一个三角形
glDrawArrays(GL_TRIANGLES,0,3);

一、shaders

其中三个叫做shader的需要用户自己写

渲染器
vertex shader接收顶点
必须自己写
shape assmbly立刻组装成形状
Geometry shader调整或增加顶点
有自动状态
光栅化变成像素点
fragment shader给像素点上色
必须自己写
test and blending互相遮挡

需要自己写的着色器,本例子要如何处理

着色器操作
vertex shader不调整坐标直接发给下一个着色器
Geometry shader使用自动化
fragment shader就是给个橙色就结束

二、标准化坐标NDC (Normalized Device Coordinates)

标准化设备坐标 NDC(Normalized Device Coordinates,NDC)

  1. 所有的坐标:中间是(0,0 , 0) ,x,y,z ∈(-1,1)
  2. 要求是:vertex shader执行后就是NDC
    在这里插入图片描述
    本例子的NDC坐标 (上图三角坐标)
float verteces[] = {
	-0.5f,-0.5f,0.0f,
	0.5f,-0.5f,0.0f,
	0.0f,0.5f,0.0f
	};

三、从内存给显存传数据

如何把点verteces传给显卡呢? 因为verteces=在内存中

  1. 定点着色器vertext shader
#version 330 core
layout (location = 0) in vec3 aPos;

void main(){
	gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0);
}

解析:

代码说明
#version 330 coreopenGL 3.3 核心模式
layout ( location = 0 )从 0 这个位置拿数据,0==Attrib Index?
in vec3 aPos外部数据都给了aPos ,aPos是vec3格式的
gl_Postiion是vertext shader的全局变量,就是要给后面的数字

顶点着色器中VBO VAO

类型
1.VBOVertex Buffer Object - 顶点数组数组中每个对象都是一个结构体
在GPU的显存上缓冲的数据内存中传来的
GL_ARRAY_BUFFER因为buffer种类特别多
所以glBindBuffer需要指定类型,才清楚操作那种
2.VAOVertex Array Object描述结构体
数组里每一个项都对应一个属性的解析
只有一种不用指定类型
边界
同步对应
内存数据
GPU缓冲 VBO + VAO
显存区域

VAO存在的目的和意义
a. 当VBO 里面只有x,y,z坐标时,每个顶点如下
此时VAO中只有一个Attribute Pointer (3float=坐标)
在这里插入图片描述
b.当VBO。 里面有坐标 + 颜色+材质时,每个顶点如下
此时VAO中至少三个Attribute Pointer (3
float=坐标 3*float=rgb 1材质)
在这里插入图片描述

//创建VBO VAO对象
GLuint VBO, VAO;

//产生openGL对象 glGenXXXX --> 都是int对象
glGenVertexArrays(1,&VAO);
glGenBuffers(1,&VBO);

//绑定VBO和VAO对象
glBindVertexArray(VAO);   //-->只有一种类型
glBindBuffer(GL_ARRAY_BUFFER,VBO); // BindBuffer可以操作很多类型,必须指定GL_ARRAY_BUFFER

 //如果data不是空的,则使用此数据初始化数据存储,跨域内存-->显存
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);

//释放VBO VAO
 glBindBuffer(GL_ARRAY_BUFFER,0);
 glBindVertexArray(0);

在这里插入图片描述
因为buffer有很多种,所以glBindBuffer必须指定类型
但是VAO只有一种,所以不用再指定类型

设置VAO
声明:void glVertexAttribPointer(index,size,type,normalized,stride,offset)
e.g. glVertexArribPointer(0,3,GL_FLOAT,GL_FALSE,3sizeof(float),(void)0);

在这里插入图片描述

类型名称说明例子的数据
GLunit index第几个属性index = 0
GLint size涉及几个值size = 3个
GLenum type这几个值得类型type = GL_FLOAT
GLboolean normalized是否需要将其标准化不需要,因为我已经给标准化了
GLsize stride下一个同类型间隔这里是3*sizeof(float)
const void* offiset就影响第一,和最前面差多少位置

开启Vertex(0)
glEnableVertexAttribArray(0);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为你解答。 1. OpenGL图形渲染管线 OpenGL图形渲染管线是OpenGL对图形数据进行处理的流程。它包括两个主要部分:顶点处理阶段和片元处理阶段。其中,顶点处理阶段将顶点数据转换成片元数据,片元处理阶段将片元数据转换成最终的图像颜色值。 2. VBO VBO(Vertex Buffer Object)是OpenGL中的一种缓冲区对象,它用于存储顶点数据。使用VBO可以将顶点数据存储到显存中,从而提高渲染效率。 3. VAO VAO(Vertex Array Object)是OpenGL中的另一种缓冲区对象,它用于存储顶点数组状态。使用VAO可以将多个VBO绑定到一个VAO中,从而方便在不同的渲染环境中切换。 4. EBO EBO(Element Buffer Object)也是OpenGL中的一种缓冲区对象,它用于存储顶点索引数据。使用EBO可以减少顶点数据的冗余,从而节省显存空间。 下面是一个简单的用例,演示如何使用VBOVAO和EBO进行三角形的渲染: ```c++ // 顶点数据 float vertices[] = { // 位置 // 颜色 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f }; // 索引数据 unsigned int indices[] = { 0, 1, 2 }; // 创建VBOVAO、EBO对象 unsigned int VBO, VAO, EBO; glGenBuffers(1, &VBO); glGenVertexArrays(1, &VAO); glGenBuffers(1, &EBO); // 绑定VBOVAO、EBO对象 glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // 设置顶点属性指针 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); // 渲染三角形 glBindVertexArray(VAO); glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0); glBindVertexArray(0); // 删除VBOVAO、EBO对象 glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); glDeleteVertexArrays(1, &VAO); ``` 上面的代码首先创建了一个顶点数组和一个索引数组,然后创建了VBOVAO、EBO对象,并将顶点数据和索引数据存储到对应的缓冲区对象中。接着,设置了顶点属性指针,并在渲染时使用glDrawElements函数渲染了三角形。最后,删除了VBOVAO、EBO对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值