我有一个应该传递给glLoadMatrixf的Matrix4D。为了克服p / invoke开销(即每次固定,编组等),我使用的是指针而不是通常的数组。所以我有两个问题。
Matrix4D基于copypasted类。它已经过测试,可能有点优化 - 不想重新发明轮子(我也很擅长数学)。无论如何,该类使用16个字段而不是1个固定数组(该类是在C#1.0时代编写的,我猜)。布局是顺序的,因此GetPointer方法只获取指向第一个字段的指针。问题是:可以有一些填充问题吗?我的意思是,例如,运行时将浮点数扩展为双精度数,以便将一包字段索引为数组将导致垃圾。或顺序布局是否符合规格要求?或者我应该严格遵守固定阵列?
第二个问题是优化器可能进行的更改。矩阵是一个值类型,在其上调用float * GetPointer()。我担心优化器可能会重新排列代码,使GetPointer指向一些垃圾。
例如:
GL32NativeMethods.glLoadMatrixf((mat1 * mat2).GetPointer());
这样做是否安全?目前我这样做是为了确定(虽然我根本不确定):
Matrix4D tmp = mat1 * mat2;
GL32NativeMethods.glLoadMatrixf(tmp.GetPointer());
此问题还有其他可能的解决方案吗? 附:在调用glLoadMatrixf之后,不需要指针。
UPD
我担心的是,在调用GetPointer()和glLoadMatrixf()之间,优化器可能会丢弃该值(正如我想的那样):
float * f = mat.GetPointer();
//这里优化器决定丢弃mat变量,因为它已不再使用了。
//也许它现在用其他辅助值填充mat的内存区域(例如,对于P / Invoke?)
GL32NativeMethods.glLoadMatrixf(F); //引用丢弃的数据。
答案 0 :(得分:0)
public static extern void glLoadMatrixf(ref Matrix4D mat);
GL32NativeMethods.glLoadMatrixf(ref mat);
本机代码将被欺骗认为mat是一个浮点数组,尽管它实际上是一个带有float数组对齐的valuetype。
答案 1 :(得分:0)
我用以下方式包装了OpenGL方法:
public static void UniformMatrix4(int location, Int32 count, bool transpose, float[] value) {
unsafe {
fixed (float* fp_value = value)
{
Delegates.pglUniformMatrix4fv(location, count, transpose, fp_value);
}
}
}
[System.Runtime.InteropServices.DllImport(Library, EntryPoint = "glUniformMatrix4fv", ExactSpelling = true)]
internal extern static unsafe void glUniformMatrix4fv(int location, Int32 count, bool transpose, float* value);
然后,我可以使用 float [] 来指定矩阵组件。当然,还有一个Matrix类,它定义了浮点数和抽象数学运算。