快速转换具有不同结构的大型数组

时间:2015-10-02 11:49:31

标签: c++ arrays opengl

在类似CAD的应用程序中,我将矢量坐标存储在以下结构的数组中:

struct coord
{
   double        x,y,z;
   unsigned char flags;
};

x,y和z保持3D坐标,标志包含附加信息(例如,如果多边形在此处结束并且未绘制此阵列中下一个坐标的行)。

现在,这些数据必须转换为普通的浮点数组,每个浮点数都有x,y和z的浮点值,并且这些三元组的数量与要绘制的多边形中的点数一样多。原因是:转换后的坐标数组必须移交给OpenGL函数glVertexAttribPointer(),让OpenGL绘制这个多边形。

我的问题:转换这些数据的最快方法是什么?我唯一的想法是分配目标数组并在循环中经过它以将坐标值转换为浮动 - 这对我来说听起来很慢。

还有其他想法吗?

谢谢! *)

*)我知道stackoverflow不喜欢友好,但实际上我喜欢友好,这就是为什么我要感谢所有试图在这里给出答案的人!在这个地球上有足够的不友好的地方,stackoverflow不应该是另一个!

1 个答案:

答案 0 :(得分:1)

好吧,如果您可以首先使用float代替double,那么您可以首先将坐标保留在此平面阵列中:

struct coord { float x,y,x; };
struct point { coord *c; // pointer into global array of coord
               unsigned char flags; };

如果您需要删除或重新排序点,这会导致问题 - 您需要反向查找来重写每个受影响点的coord指针。

它还引入了额外的间接,因此可能会以牺牲其他操作为代价来加速渲染。

最后,float完全可能不够精确,不适合您的主要用途,在这种情况下,您必须在某个时刻执行double->float转换。避免在GL调用之前执行此操作的唯一方法是始终更新每个坐标的两个版本(或者保持GL坐标需要重写的脏点列表的混合方法)。

NB。我忘了提 - 如果你想使用它,你可能需要明确地将coord struct标记为打包,具体取决于你的填充和对齐规则。您总是可以存储float的平面数组并指向第一个(x)元素。