初识OpenGL (-)顶点之“链接顶点属性“

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初识OpenGL (-)顶点之“链接顶点属性“相关的知识,希望对你有一定的参考价值。

1. 链接顶点属性

在渲染前指定OpenGL该如何解释顶点数据

  • 位置数据被储存为32位(4字节)float值。
  • 每个位置包含3个float。
  • 这3个值之间没有空隙(或其他值)。这几个值在数组中紧密排列(Tightly Packed)。
  • 数据中第一个值在缓冲开始的位置。

1.1 glVertexAttribPointer

eg.

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

参数一: 指定顶点属性的位置值。
eg. 在顶点着色器中使用layout(location = 0)定义了position顶点属性的位置值(Location)为0。

每个顶点属性从一个VBO管理的内存中获得它的数据,而具体是从哪个VBO(程序中可以有多个VBO)获取则是通过在调用
glVertexAttribPointer时绑定到GL_ARRAY_BUFFER的VBO决定的。

参数二:指定顶点属性的大小: 3。
参数三:指定数据的类型,这里是GL_FLOAT(GLSL中vec*都是由浮点数值组成的)。
参数四: 数据是否被标准化(Normalize)。GL_TRUE:所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。
参数五: 步长(Stride),在连续的顶点属性组之间的间隔。由于下个组位置数据在3个float之后,我们把步长设置为3 * sizeof(float)。
由于我们知道这个数组是紧密排列的(在两个顶点属性之间没有空隙)我们也可以设置为0来让OpenGL决定具体步长是多少(只有当数值是紧密排列时才可用)。一旦我们有更多的顶点属性,我们就必须更小心地定义每个顶点属性之间的间隔(译注: 这个参数的意思简单说就是从这个属性第二次出现的地方到整个数组0位置之间有多少字节)。

最后一个参数的类型是void*,所以需要我们进行这个奇怪的强制类型转换。它表示位置数据在缓冲中起始位置的偏移量(Offset)。由于位置数据在数组的开头,所以这里是0。我们会在后面详细解释这个参数。

1.2

// 0. 复制顶点数组到缓冲中供OpenGL使用
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
// 1. 设置顶点属性指针
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
// 2. 当我们渲染一个物体时要使用着色器程序
glUseProgram(shaderProgram);
// 3. 绘制物体
someOpenGLFunctionThatDrawsOurTriangle();

以上是关于初识OpenGL (-)顶点之“链接顶点属性“的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

openGL之API学习(一六七)默认着色器 顶点属性索引 别名索引

初识OpenGL VBO顶点缓冲对象

OpenGL入门之纹理Texture