0

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 関数はエラーをスローしませんが、出力が配列であるため、これは異なると思います。実際には、配列を返す関数がもう 1 つありますが、同じエラーが発生します。

[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 内から発生するとは想像できません。

関数シグネチャのどこかにサイズを指定する必要があるような気がしますか? そして、それが出力パラメーターに限定されているのか、それともすべての「構造体の配列」パラメーターに限定されているのか疑問に思っています。

4

1 に答える 1

2

配列パラメーターが正しく宣言されていません。を使用するとout、誤った余分なレベルの間接化が導入されます。割り当てた配列を渡し、アンマネージ コードにデータを入力させる必要があります。このようにパラメータを宣言します

private static extern void ovrHmd_GetRenderScaleAndOffset(
    ovrFovPort fov,                                       
    ovrSizei textureSize,
    ovrRecti renderViewport,
    [Out] ovrVector2f[] uvScaleOffsetOut
);

関数を呼び出す前に配列を割り当てます。

ovrVector2f[] uvScaleOffsetOut = new ovrVector2f[2];

インターフェイスの管理されていない側を示していれば、FWIW は役に立ちました。

于 2014-09-05T06:23:43.830 に答える