OpenGL与C++:将类数组传递给glTexImage2d时出现vtable问题



我用float r、float g、float b和float alpha创建了一个类Color。它有一个带有虚拟析构函数的基类

我正试图将一个Color数组传递给opengl函数glTexImage2DGL_RGBA组织类型为float(它将是一个{float r,float g,float b,float alpha}的数组)。这要求Color仅包含4个浮点值(大小为16字节)。

然而,sizeof(Color)揭示了我的类具有20字节的大小,这是由于Color的基类具有vtable(这要归功于析构函数)。

如何保持我的vtable,同时仍将我的Color数组传递给glTexImage2D

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

您可以在glPixelStore()文档中看到glTexImage2D()的所有额外参数。正如您所看到的,没有用于在像素之间添加"步幅"或"填充"的参数。可以在行的开头或结尾,或在图像(3D)之间添加空间,但在像素之间不添加任何空间。

建议:一组相同的4D矢量,每个矢量都有一个vtable,这是一种设计气味。这是一个糟糕的设计。为了与C兼容,您的颜色类型应该是标准布局类型。请注意,这特别意味着您不能使用虚拟函数。

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

一些gl函数允许您将stride与数据指针一起传递,这告诉gl每次应该增加多少字节才能到达下一个数据元素。你可以通过sizeof(Color)的一步,如果你能在结构布局中找到偏移量来获得浮动。。。好吧,那将是我所能看到的唯一的方法。然而,你肯定需要做出一些改变。要强制相邻布局,您必须使浮动全部保持在float[4]中。。。

无论如何,glTexImage2D实际上没有步幅,所以这是不可能的。

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

你可能会做得更好,为颜色制作一个简单的POD类型,然后无论你在析构函数中发生了什么新奇的事情,制作第二个类,它包含一个颜色POD,也有基类等。

最新更新