Oculus SDK中的此功能提供错误代码0xc0000005:
[DllImport(LibFile)]
private static extern void ovrHmd_GetRenderScaleAndOffset(ovrFovPort fov,
ovrSizei textureSize,
ovrRecti renderViewport,
[MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
[Out] out ovrVector2f[] uvScaleOffsetOut);
没有其他PInvoke函数抛出错误,但我认为这是不同的,因为输出是一个数组。实际上还有另一个函数返回一个数组,它给出了同样的错误:
[DllImport(LibFile)]
private static extern void ovrHmd_GetEyeTimewarpMatrices(IntPtr hmd, ovrEyeType eye, ovrPosef renderPose,
[MarshalAs(UnmanagedType.LPArray, SizeConst = 2)]
[Out] out ovrMatrix4f_Raw[] twnOut);
以下是结构声明:
[StructLayout(LayoutKind.Sequential)]
public struct ovrVector2f
{
public float x, y;
}
[StructLayout(LayoutKind.Sequential)]
public struct ovrMatrix4f_Raw
{
public float m00;
public float m01;
public float m02;
public float m03;
public float m10;
public float m11;
public float m12;
public float m13;
public float m20;
public float m21;
public float m22;
public float m23;
public float m30;
public float m31;
public float m32;
public float m33;
}
看看SDK源代码,我知道至少ovrHmd_GetRenderScaleAndOffset看起来很无聊,我无法想象这个错误会来自SDK内部。
我觉得我需要在函数签名中的某处指定大小?我想知道它是否仅限于输出参数,或者任何和所有"结构的数组"参数。
答案 0 :(得分:2)
数组参数声明不正确。 out
的使用引入了虚假的额外间接层。您需要传递一个您分配的数组,并让非托管代码填充它。像这样声明参数
private static extern void ovrHmd_GetRenderScaleAndOffset(
ovrFovPort fov,
ovrSizei textureSize,
ovrRecti renderViewport,
[Out] ovrVector2f[] uvScaleOffsetOut
);
在调用函数之前分配数组:
ovrVector2f[] uvScaleOffsetOut = new ovrVector2f[2];
FWIW,如果你展示了界面的非托管方面,它会有所帮助。