【问题标题】:OpenGL stride glVertexPointerOpenGL 步幅 glVertexPointer
【发布时间】:2014-02-27 00:04:43
【问题描述】:

我正在开发一个 OpenGL 2.0 渲染器 (https://bitbucket.org/mattiascibien/anima-render),实际上我遇到了一些我完全无法理解的东西,这就是 glVertexPointer() 指令的步幅。其实我的代码是这样的

glBindBuffer(GL_ARRAY_BUFFER, data.vertex_buffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(
    3,
    GL_FLOAT,
    sizeof(GLfloat)*3,
    (void*)0
    );

但我实际上通过阅读 OpenGL 文档发现,步幅实际上应该为 0。更改它不会改变模型的渲染方式。

什么值是正确的?为什么改变这个参数没有区别?

编辑:数据存储在一个

std::vector<GLFloat>

使用 sizeof(GLfloat)*2 或 0 的 glTexCoordPointer 也会发生同样的情况

【问题讨论】:

    标签: opengl


    【解决方案1】:

    https://www.opengl.org/sdk/docs/man2/xhtml/glInterleavedArrays.xml 提供更多信息。

    如果 stride 为 0,则聚合元素连续存储。否则,步长字节出现在一个聚合数组元素的开头和下一个聚合数组元素的开头之间。

    当您提供步幅时,即0 或您的“结构”大小 (3*sizeof(GLFloat)) 是相同的。但在这种情况下,我会选择 0。

    【讨论】:

    • 我在大学课上一直不明白为什么。谢谢你的解释。
    • 这是一种误导,因为人们可能会想到来自end-to-next 的跨步蜂鸣。实际使用时,例如struct 您将始终将 sizeof(struct) 放在那里,并使用 offset(struct, member) 作为偏移量指针。
    【解决方案2】:

    步幅是从一个实体的起点到下一个实体的起点的距离。 0是特殊的:表示一个实体的end到下一个实体的开始的距离为0。所以基本上0和sizeof(entity)是一样的。

    基本上,他们在一个参数中包含了 2 种不同的机制,我认为这不是最理想的。

    【讨论】:

      猜你喜欢
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-07
      • 2011-05-12
      • 1970-01-01
      相关资源
      最近更新 更多