4

Color用float r,float g,float b,float alpha做了一个类。它有一个带有虚拟析构函数的基类

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

但是,由于具有vtable的基类,sizeof(Color)这表明我的类的大小为 20 字节,这要归功于析构函数。Color

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

4

2 回答 2

4

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

无论如何,glTexImage2D实际上并没有大步,所以这是窗外的。

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

您最好为颜色创建一个简单的 POD 类型,然后在析构函数中发生任何奇特的事情,创建第二个包含颜色 POD 的类,并具有基类等。

于 2016-01-08T20:34:35.227 回答
4

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

glTexImage2D()您可以在glPixelStore()文档中查看所有额外参数。如您所见,没有用于在像素之间添加“步幅”或“填充”的参数。可以选择在行的开头或结尾,或在图像 (3D) 之间添加空间,但在像素之间没有添加空间。

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

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

于 2016-01-08T20:37:00.993 回答