glVertexAttribPointer“步幅”参数是什么?

问题描述 投票:0回答:1

刚刚开始学习openGL,并且像往常一样,试图理解我编写的每一段代码的作用以及它为什么在那里,但我无法理解stride参数是什么。
根据文档,这意味着(提前进行粗略复制和粘贴)

指定连续通用顶点之间的字节偏移量 属性。如果步长为 0,则通用顶点属性为 理解为紧密排列在阵列中。初始值为0。

好的,最后一部分我能理解。当我像这样做数组1时(位置紧密地排列在数组中)

    GLfloat vertices[] = {
      //x,     y,     z
        0.0f,  0.5f,  0.0f,  // middle top
       -0.5f, -0.5f,  0.0f,  // bottom left
        0.5f, -0.5f,  0.0f   // bottom right
    };

并且stride有0,它有效:)

glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

但是如果我向它添加更多属性1

    GLfloat vertices[] = {
      //x,     y,     z,     r,     g,     b
        0.0f,  0.5f,  0.0f,  1.0f,  0.0f,  0.0f,  // middle top
       -0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  0.0f,  // bottom left
        0.5f, -0.5f,  0.0f,  1.0f,  0.0f,  0.0f   // bottom right
    };

现在stride是每个顶点的大小,为什么?

glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 6*sizeof(GLfloat), (void*)0);

如果我尝试使用逻辑并将步幅设置为 3,因为它是一个位置与下一个位置之间的距离1,它只是出于某种原因这样做 (here)

c++ opengl opengl-3
1个回答
0
投票

它是连续的通用顶点属性之间的字节偏移。在第二个示例中,每个属性元组都有 6 个组件(x、y、z、r、g、b),每个组件有 4 个字节 (

sizeof(float)
)。因此,正确的“步幅”是
6*sizeof(GLfloat)

如果“步幅”设置为 0,则根据“大小”和“类型”自动计算距离。在第一种情况下,“大小”为 3,“类型”为
GL_FLOAT
,因此自动计算的“步幅”为
3*sizeof(GLfloat)

© www.soinside.com 2019 - 2024. All rights reserved.