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 *因为我的值不是指针。我该怎么做才能解决这个警告?
答案 0 :(得分:1)
最初,当引入顶点数组时,回到OpenGL-1.1中,像glVertexPointer
,glTexCoordPointer
等函数接受指向客户端地址空间的指针。当着色器被引入时,它们带有任意顶点属性,函数glVertexAttribPointer
遵循相同的语义(这在OpenGL-2.1中)。
缓冲区对象API然后重用现有函数,您可以在其中传递指针参数的整数。
OpenGL-3.3核心最终强制使用缓冲区对象,因为glVertexAttribPointer函数在其函数签名中定义为void*
是一个痛处;我在https://stackoverflow.com/a/8284829/524368中写了关于它的范围(但请务必阅读其余的答案)。
最终引入了新功能,允许对顶点属性的访问方式进行更细粒度的控制,取代glVertexAttribPointer,并且这些功能完全依赖于偏移。