1

OpenTK の GenFramebuffers 関数を使用しようとしています。ネイティブ OpenGL では、この関数は、生成する多数のフレームバッファ名と、名前が格納される int へのポインタを受け取ります。しかし、OpenTK の亜種は、生成するためにいくつかの名前を取り、単一のInt32 パラメータを使用します。

OpenTK からの関数のソース コードは次のとおりです。

    public static void GenFramebuffers(Int32 n, out Int32 framebuffers)
    {
        unsafe
        {
            fixed (Int32* framebuffers_ptr = &framebuffers)
            {
                Delegates.glGenFramebuffers((Int32)n, (UInt32*)framebuffers_ptr);
                framebuffers = *framebuffers_ptr;
            }
        }
    }

私が見る限り、n に 1 以外を指定すると、メモリが上書きされます。念のため、実際に n=2 で試してみたところ、out パラメータとして渡した Int32 に加えて、たまたまメモリ内にあった Int32 が書き込まれました。

OpenTK で影響を受ける関数はこれだけではなく、すべての genXXX 関数がそのようなものです。

ここで私は気が狂っていますか、それとも OpenTK が深刻に壊れていますか?

4

1 に答える 1

1

内部機能だと思います。OpenTK の GL クラスには、単一のフレームバッファを生成する次の関数があります。

    public static int GenFramebuffer()
    {
        int id;
        GenFramebuffers(1, out id);
        return id;
    }

配列型引数の場合、OpenTK には次の関数があります。

void GenFramebuffers(Int32 n, [OutAttribute] Int32[] framebuffers)
unsafe void GenFramebuffers(Int32 n, [OutAttribute] Int32* framebuffers)

しかし、あなたが言及した機能を次のように使用することもできると思います:

int[] arr = new int[15];
GenFramebuffers(10, out arr[5]); // will fill 10 starting with index 5
于 2012-06-29T22:40:45.600 に答える