【问题标题】:glVertexAttribPointer last attribute value or pointerglVertexAttribPointer 最后一个属性值或指针
【发布时间】:2015-05-25 06:41:25
【问题描述】:

glVertexAttribPointer 的最后一个属性是 const GLvoid* 类型。但它真的是一个指针吗?它实际上是一个偏移量。如果我输入 0,则表示偏移量为 0,而不是指向偏移量的空指针。在我的引擎中,我使用了这个函数:

void AbstractVertexData::vertexAttribPtr(int layout) const
{
    glVertexAttribPointer(layout,
                          getShaderAttribs()[layout]->nbComponents,
                          static_cast<GLenum>(getShaderAttribs()[layout]->attribDataType),
                          getShaderAttribs()[layout]->shouldNormalize,
                          getVertexStride(layout),
                          reinterpret_cast<const void*>(getVertexAttribStart(layout)));
}

getVertexAttribStart 返回一个 intptr_t。当我运行 drmemory 时,它显示“未初始化读取”,我想删除该警告。此警告来自 reinterpret_cast。我不能 static_cast 到 const void* 因为我的值不是指针。我应该如何解决这个警告?

【问题讨论】:

    标签: pointers opengl dr-memory


    【解决方案1】:

    最初,在 OpenGL-1.1 中引入顶点数组时,glVertexPointerglTexCoordPointer 等函数接受指向客户端地址空间的指针。当着色器被引入时,它们带有任意顶点属性,并且函数glVertexAttribPointer 遵循相同的语义(这是在 OpenGL-2.1 中)。

    缓冲区对象 API 然后重用现有函数,您可以在其中传递一个整数作为指针参数。

    OpenGL-3.3 核心最终强制使用缓冲区对象,自从 glVertexAttribPointer 函数在其函数签名中使用void* 定义以来就是一个痛处;我已经在https://stackoverflow.com/a/8284829/524368 中详细描述了它(但请务必阅读其余答案)。

    最终引入了新函数,允许对顶点属性的访问方式进行更细粒度的控制,取代 glVertexAttribPointer,并且这些函数纯粹在偏移量上运行。

    【讨论】:

    • 嗯好吧,但它并没有摆脱 drmemory 的警告。我没有尝试替换函数声明,因为它对我来说有点太复杂了......(与 OpenGL 和 GLEW 的函数混淆)。我只想要一个不会抛出警告或其他 OpenGL 函数的演员表:你说有 gl...Offset 函数。它们是什么?
    • @user2924010: gl…偏移量没有官方指定。本质上,它们只是签名稍有不同的函数指针(采用uintptr_t 而不是void*)并将gl…指针函数地址分配给这些…偏移指针。请参阅我的其他答案中的最后 3 段,了解它是如何完成的。当然,如果你想限制自己使用 OpenGL-4,你可以使用 glVertexAttribFormat 系列函数。
    • typedef void (*TFPTR_VertexOffset)(GLuint, GLint, GLenum, GLboolean, GLsizei, uintptr_t); TFPTR_VertexOffset myglVertexAttribOffset = (TFPTR_VertexOffset)glVertexAttribPointer;这给出了一个错误。即使在调试中也没有任何信息。
    • @user2924010:它到底给了你哪个错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2018-12-12
    • 2016-11-05
    • 1970-01-01
    • 2017-12-17
    • 2019-03-05
    相关资源
    最近更新 更多