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;
            }
        }
    }

据我所见,如果将除 1 以外的任何值指定为 n,它将覆盖内存。为了确保这一点,我实际上用 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 回答