【问题标题】:C++: OpenGL, glm and struct paddingC++:OpenGL、glm 和结构填充
【发布时间】:2012-11-14 08:18:08
【问题描述】:

我可以安全地使用 glm::* 类型(例如 vec4、mat4)来填充顶点缓冲区对象吗?

std::vector<glm::vec3> vertices;    
glBufferData(GL_ARRAY_BUFFER,  sizeof(glm::vec3) * vertices.size(), &vertices[0], GL_STATIC_DRAW);

我不太确定这一点,因为我认为结构填充(成员对齐)可能会造成一些麻烦,尽管我测试过的所有编译器都会返回预期的大小。

我正在为 C++11 编译器开发(也许这会有所不同)。

【问题讨论】:

    标签: c++ opengl c++11 vertex-buffer


    【解决方案1】:

    定义“安全”。

    C++ 为实现提供了广泛的填充结构,因为它们认为合适。所以就 ISO C++ 而言,这是否“有效”是依赖于实现的行为。

    它通常适用于桌面平台的许多编译器。我不能说 ARM CPU,但一般来说,glm::vec3 的大小是 3 个浮点数。但是,如果你想确定,你总是可以执行一个简单的static_assert

    static_assert(sizeof(glm::vec3) == sizeof(GLfloat) * 3, "Platform doesn't support this directly.");
    

    【讨论】:

      【解决方案2】:

      是的,glm 专为此目的而设计和构建。

      【讨论】:

      • 根据来源,他们只是使用具有 4 个浮点数的结构,默认情况下对结构填充是不安全的。这就是我问这个问题的原因。
      • 为什么不安全?该库的全部目标是与 OpenGL 和 GLSL 完全一致,并且自 2005 年以来一直在实现这一目标。
      • @pwny:OP 已经解释了原因并且是正确的。听起来图书馆在实现其目标方面存在重大缺陷。
      • @Kr0e 如果 glm 文档指定它是安全的,那么他们将需要实现和测试它,以便在他们支持的实现上是安全的。他们没有理由不能依靠实现定义的行为来实现它。
      • @pwny:只要他们实际上并未指示编译器不要打包该结构,那么无论他们认为自己已经对其进行了多少测试,这都是不安全的。我不在乎它“正式支持”什么。
      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 2014-10-12
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2017-06-08
      • 2014-06-14
      相关资源
      最近更新 更多