使用 C++ 的 OpenGL:将 class 数组传递给 glTexImage2d 时出现 vtable 问题

OpenGL with C++: vtable troubles when passing class array to glTexImage2d

我用 float r、float g、float b、float alpha 制作了一个 class Color。它有一个 base class 和一个虚拟析构函数 .

我正在尝试将 Color 数组传递给 opengl 函数 glTexImage2D,其中 GL_RGBA 组织类型为 float(这将是一个数组 {float r, float g, float b,浮动 alpha})。这要求 Color 仅包含 4 个浮点数(大小为 16 字节)。

但是,sizeof(Color) 表明我的 class 的 大小为 20 字节 ,因为基数 class 为 Color 有一个 vtable,多亏了析构函数。

如何保留我的 vtable 并将我的 Color 数组传递给 glTexImage2D

一些 gl 函数允许您将 stride 与数据指针一起传递,它告诉 gl 每次应该将指针递增多少字节才能到达下一个数据元素。您可以通过 sizeof(Color) 的步幅,并且如果您可以在结构布局中找到到达浮点数的偏移量……好吧,这将是我能看到的唯一方法。但是,您肯定需要进行一些更改。要强制相邻布局,您必须使浮动全部保持在 float[4]...

无论如何,glTexImage2D 实际上并没有步幅,所以这是 window。

我认为更好的问题是,为什么你的颜色结构有一个基 class 或一个虚拟析构函数?颜色数据不是资源,因此这可能违反了三规则/五规则/零规则。

您最好为颜色制作一个简单的 POD 类型,然后无论您在析构函数中发生什么花哨的东西,制作第二个 class,它包含一个颜色 POD,并且还有基础 class 等等

简答:不,你不能那样做。

您可以在 glPixelStore() documentation 中看到 glTexImage2D() 的所有额外参数。如您所见,没有用于在像素之间添加 "stride" 或 "padding" 的参数。可以选择在行首或行尾或图像 (3D) 之间添加 space,但像素之间不添加任何内容。

建议: 一组相同的 4D 向量,每个向量都有一个 vtable 是一种设计味道。这是一个糟糕的设计。你的颜色类型,为了兼容C,应该是standard layout type。请注意,特别是这意味着您不能使用虚函数。

如果您确实需要具有虚拟析构函数的基类型,请创建一个包装类型。