Opengl备忘2--绘制三角形

本文介绍OpenGL基础知识,包括3D坐标到2D坐标的转换流程、顶点缓冲对象(VBO)的创建与使用、顶点数组对象(VAO)的作用及初始化过程、索引缓冲对象(IBO)的使用方法以及如何设置OpenGL的线框模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Opengl中任何物体都是在3D空间中,而屏幕和窗口是2D,所以需要将3D坐标转为适用屏幕的2D像素

大概是如下一个管线(Pipeline)




2.

三角形顶点:

GLfloat vertices[] = { -0.5f, -0.5f,0.0f,0.5f, -0.5f,0.0f,0.0f,0.5f,0.0f};

VBO:顶点缓冲对象,会在GPU内存中存储大量顶点,使用的好处是可以一次性发送一大批数据到显卡上,

GLuint VBO;

glGenBuffers(1, &VBO);

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW);// 将数据复制到缓冲内存中

  • GL_STATIC_DRAW :数据不会或几乎不会改变。
  • GL_DYNAMIC_DRAW:数据会被改变很多。
  • GL_STREAM_DRAW :数据每次绘制时都会改变。
数据存储方式:xyzxyzxyzxyz 每个位置xyz
glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);
glEnableVertexAttribArray(0);

关于glVertexAttribPointer()
---第一个参数指定我们要配置哪一个顶点属性。我们在顶点着色器中使用layout(location = 0)定义了顶点属性——位置(Position)的位置值(Location)。这样要把顶点属性的位置值(Location)设置为0,因为我们希望把数据传递到这个顶点属性中,所以我们在这里填0。
在2.0中,一般通过glGetAttriblocation(),获得位置,大多也是0
---- 第二个参数指定顶点属性的大小。顶点属性是 vec3 类型,它由3个数值组成。
---- 第三个参数指定数据的类型,这里是 GL_FLOAT (GLSL中 vec* 是由浮点数组成的)。
---- 下个参数定义我们是否希望数据被标准化。如果我们设置为 GL_TRUE ,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为 GL_FALSE
---- 第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性之间间隔有多少。由于下个位置数据在3个 GLfloat 后面的位置,我们把步长设置为 3 * sizeof(GLfloat) 。要注意的是由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。每当我们有更多的顶点属性,我们就必须小心地定义每个顶点属性之间的空间(这个参数的意思简单说就是从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。
-----最后一个参数有奇怪的 GLvoid* 的强制类型转换。它表示我们的位置数据在缓冲中起始位置的偏移量。由于位置数据是数组的开始,所以这里是0。我们会在后面详细解释这个参数。


使用:

(1)复制顶点数组到缓冲中给opengl使用

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW);

(2)设置顶点属性

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);

glEnableVertexAttribArray(0);

(3)使用着色器

glUseProgram(shaderProgram);

//


3. opengl3.0 支持VAO[顶点数组对象]

一个顶点数组对象储存下面的内容:

  • 调用glEnableVertexAttribArrayglDisableVertexAttribArray
  • 使用glVertexAttribPointer的顶点属性配置。
  • 使用glVertexAttribPointer进行的顶点缓冲对象与顶点属性链接。

生成VAO:

GLuint VAO;glGenVertexArrays(1, &VAO);

// ..:: 初始化代码 (一次完成 (除非你的物体频繁改变)) :: ..

// 1. 绑定VAO

glBindVertexArray(VAO);

// 2. 把顶点数组复制到缓冲中提供给OpenGL使用

glBindBuffer(GL_ARRAY_BUFFER, VBO);

glBufferData(GL_ARRAY_BUFFER,sizeof(vertices), vertices, GL_STATIC_DRAW);

// 3. 设置顶点属性指针

glVertexAttribPointer(0,3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid * )0);

glEnableVertexAttribArray(0);

//4. 解绑VAO

glBindVertexArray(0);

[...]

// ..:: 绘制代码 (in Game loop) :: ..

// 5. 绘制物体

glUseProgram(shaderProgram);

glBindVertexArray(VAO);

glDrawArrays(GL_TRIANGLES,0,3);

glBindVertexArray(0);



4. IBO或EBO

GLfloat vertices[] = { 0.5f,0.5f,0.0f,// 右上角0.5f, -0.5f,0.0f,// 右下角 -0.5f, -0.5f,0.0f,// 左下角 -0.5f,0.5f,0.0f// 左上角};

GLuint indices[] = { // 起始于0!0,1,3,// 第一个三角形1,2,3// 第二个三角形};



GLuint IBO;

glGenBuffers(1, &IBO);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices), indices, GL_STATIC_DRAW);


//绘制

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_INT, 0);



5.线框模式

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值