0

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* 因为我的值不是指针。我应该怎么做才能解决这个警告?

4

1 回答 1

1

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

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

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

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

于 2015-03-22T10:54:27.180 回答