【发布时间】:2013-04-04 09:33:52
【问题描述】:
因此,OpenGL 编程的一个关键要求是您以保证连续内存的方式存储顶点。我最近读了几本专业图形程序员写的不错的书,他们都使用了相同想法的变体:将顶点打包成floats的struct,x,y,z,然后打包多个顶点放入 c 样式数组或 std::vector 中的 structs。它有效。
但我在这个网站上一次又一次地看到struct 不能保证内存连续性。据说如果您的结构包含所有floats,那么它们可能是连续的,但不能保证。array 和std::vector 可以保证它,但如果您放入数组或向量中的内容不连续,则无关紧要。
对于生产代码,我希望“可能”不会削减它。因此,尽管这两本书中的建议显然更适合学习,但我想知道还有哪些其他好的技术可以以保证连续记忆的方式轻松组织顶点数据,或者,我会接受我不应该担心这个的建议,可能应该足够好。
图形领域还有哪些常用的好方法?
【问题讨论】:
-
除了您可能采取的任何其他预防措施之外,请将其放入您的代码中:
static_assert(sizeof(vertex) == sizeof(float) * 3, "vertex not properly aligned");-- 如果在对您的工具链进行任何修改时,您的假设失败了,您将在编译时收到通知. -
C++ 标准可能无法保证,但可能由特定平台上的 ABI“标准”指定。这意味着一旦你确定它可以在一个平台上运行,它就不会发生不可预测的变化,或者它会破坏所有已编译的库。基本上,C++ 标准并不是唯一适用的标准,每个平台都有这些东西的标准。即使它不是书面的、已发布的标准,它仍然不会轻易被破坏。当然,您必须确保在移植到平台时您的假设是正确的,但之后我看不到它会崩溃。
标签: c++ opengl graphics opengl-es 3d