使用 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。请注意,特别是这意味着您不能使用虚函数。
如果您确实需要具有虚拟析构函数的基类型,请创建一个包装类型。
我用 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。请注意,特别是这意味着您不能使用虚函数。
如果您确实需要具有虚拟析构函数的基类型,请创建一个包装类型。