glVertexAttribPointer最后一个属性值或指针

时间:2015-03-22 03:11:12

标签: pointers opengl dr-memory

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

1 个答案:

答案 0 :(得分:1)

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

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

OpenGL-3.3核心最终强制使用缓冲区对象,因为glVertexAttribPointer函数在其函数签名中定义为void*是一个痛处;我在https://stackoverflow.com/a/8284829/524368中写了关于它的范围(但请务必阅读其余的答案)。

最终引入了新功能,允许对顶点属性的访问方式进行更细粒度的控制,取代glVertexAttribPointer,并且这些功能完全依赖于偏移。