1. 如何填充VBO、配置顶点属性指针以及如何把它们都储存到一个VAO里。

step1. 把颜色数据加进顶点数据中。

eg. 把颜色数据添加为3个float值至vertices数组,把三角形的三个角分别指定为红色、绿色和蓝色:

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    // 顶部
};

step2. 调整一下顶点着色器,使它能够接收颜色值作为一个顶点属性输入。需要注意的是我们用layout标识符来把aColor属性的位置值设置为1:

#version 330 core
layout (location = 0) in vec3 aPos;   // 位置变量的属性位置值为 0
layout (location = 1) in vec3 aColor; // 颜色变量的属性位置值为 1out vec3 ourColor; // 向片段着色器输出一个颜色void main()
{gl_Position = vec4(aPos, 1.0);ourColor = aColor; // 将ourColor设置为我们从顶点数据那里得到的输入颜色
}

step3. 修改一下片段着色器:不再使用uniform来传递片段的颜色,使用ourColor输出变量

#version 330 core
out vec4 FragColor;
in vec3 ourColor;void main()
{FragColor = vec4(ourColor, 1.0);
}

step4. 重新配置顶点属性指针。

添加了另一个顶点属性,并且更新了VBO的内存,更新后的VBO内存中的数据现在看起来像这样:

使用glVertexAttribPointer函数更新顶点格式,

// 位置属性
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);

由于我们现在有了两个顶点属性,我们不得不重新计算步长值。为获得数据队列中下一个属性值(比如位置向量的下个x分量)我们必须向右移动6个float,其中3个是位置值,另外3个是颜色值。这使我们的步长值为6乘以float的字节数(=24字节)。
同样,这次我们必须指定一个偏移量。对于每个顶点来说,位置顶点属性在前,所以它的偏移量是0。颜色属性紧随位置数据之后,所以偏移量就是3 * sizeof(float),用字节来计算就是12字节。

1.1 片段插值(Fragment Interpolation)

片段着色器中的处理:当渲染一个三角形时,光栅化(Rasterization)阶段通常会造成比原指定顶点更多的片段。光栅会根据每个片段在三角形形状上所处相对位置决定这些片段的位置。
基于这些位置,它会插值(Interpolate)所有片段着色器的输入变量。比如说,我们有一个线段,上面的端点是绿色的,下面的端点是蓝色的。如果一个片段着色器在线段的70%的位置运行,它的颜色输入属性就会是一个绿色和蓝色的线性结合;更精确地说就是30%蓝 + 70%绿。
这正是在这个三角形中发生了什么。我们有3个顶点,和相应的3个颜色,从这个三角形的像素来看它可能包含50000左右的片段,片段着色器为这些像素进行插值颜色。如果你仔细看这些颜色就应该能明白了:红首先变成到紫再变为蓝色。片段插值会被应用到片段着色器的所有输入属性上。

初识OpenGL (-)VAOVBO相关推荐

  1. 初识OpenGL (-)纹理过滤(Texture Filtering)

    1. OpenGL需要知道怎样将纹理像素(Texture Pixel,也叫Texel)映射到纹理坐标. 纹理坐标 不依赖于分辨率(Resolution),它可以是任意浮点值, 给模型顶点设置的那个数组 ...

  2. 初识 OpenGL ES2.0

    原文链接:Android OpenGLES2.0(一)--了解OpenGLES2.0 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API ...

  3. 初识OpenGL (-)VAO顶点数组对象

    1. VAO顶点数组对象(Vertex Array Object) 可以像顶点缓冲对象那样被绑定,任何随后的顶点属性调用都会储存在VAO中. 好处:当配置顶点属性指针时,你只需要将那些调用执行一次,之 ...

  4. 初识OpenGL (3)片段着色器(Fragment Shader)

    step1. 片段着色器 计算像素最后的颜色输出. 片段着色器只需要一个输出变量,这个变量是一个4分量向量,它表示的是最终的输出颜色,我们应该自己将其计算出来. #version 330 core o ...

  5. 初识OpenGL (-)坐标系统(Coordinate System)

    1. 5个不同的坐标系统 局部空间(Local Space,或者称为物体空间(Object Space)) 世界空间(World Space) 观察空间(View Space,或者称为视觉空间(Eye ...

  6. 初识OpenGL (2)编译着色器

    step1. 创建一个着色器对象 用ID来引用,储存这个顶点着色器为unsigned int, unsigned int vertexShader; vertexShader = glCreateSh ...

  7. 《OpenGL编程指南(原书第9版)》——导读

    ** 前言 ** OpenGL图形系统是图形硬件的一种软件接口(GL表示Graphics Library,即图形库).它使得用户可以创建交互式的程序以产生运动的三维对象的颜色图像.通过OpenGL,我 ...

  8. Android OpenGL ES 画球体

    最近因为兴趣所向,开始学习OpenGL绘图.本文以"画球体"为点,小结一下最近所学. > 初识OpenGL ES 接触OpenGL是从Android开始的.众所周知,Andr ...

  9. [OpenGL红宝书]第一章 OpenGL概述

    第一章 OpenGL概述 标签(空格分隔): OpenGL 第一章 OpenGL概述 1 什么是OpenGL 2 初识OpenGL程序 3 OpenGL语法 4 OpenGL渲染管线 41 准备向Op ...

最新文章

  1. android7.0图标反馈,android7.0 webview中 图标错位
  2. 产品与技术优势发威 用友U9截击SAP ORACLE
  3. 驰骋工作流引擎-嵌入式表单的介绍
  4. 安全配置交换机端口 提高网络安全性
  5. js获取过滤条件中参数的快捷方式
  6. Lambda表达式和闭包Closure
  7. 如何在MyEclipse中显示行数
  8. kafka再均衡监听器测试
  9. 现有代码移植到Metro App
  10. UVA489 Hangman Judge【模拟】
  11. Weui 结合 xmlHttpRequest 上传图片
  12. MATLAB 2016a安装
  13. 火狐无法安装扩展_立即安装4个Firefox扩展
  14. nrf52840蓝牙协议栈主机BLE串口
  15. ps怎么抠地图线路_这些图片用PS怎么抠?ps抠图入门及PS抠图常用的7种方法(附详细步骤)...
  16. matlab imcrop 对应python函数_MATLAB车牌识别之车牌精准定位浅谈
  17. Maven子父工程依赖配置,小白也能看得懂
  18. 全新造型游戏耳机再出发—极度未知HyperX 毒刺2 灵动版游戏耳机
  19. Google hacking能做什么以及对应的语法
  20. 如何在海外高效的推广APP?海外推广产品该注意哪些点?

热门文章

  1. python 自动生成word文档_python实现的生成word文档功能示例
  2. Procise使用举例
  3. 从毕业生成为职业人(转载)
  4. Hessian的入门
  5. mysql 5.7 多个_mysql5.7多实例
  6. jquery 根据class名 赋值_jquery为input赋值方法总结
  7. 要给自己定个目标了。。。
  8. layui.laytpl的if else 写法
  9. linux开启关闭Redis
  10. 第21讲:Python字符串格式化的概念以及使用百分号作为占位符对字符串进行格式化