Ошибка OpenTK GenFramebuffers

Я пытаюсь использовать функцию GenFramebuffers из OpenTK. В нативном 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, и действительно он записал Int32, который я передал в качестве выходного параметра, плюс один Int32, который оказался в памяти после него.

Это не единственная затронутая функция в OpenTK, все функции genXXX такие.

Я здесь схожу с ума или OpenTK серьезно сломан?


person kaalus    schedule 29.06.2012    source источник


Ответы (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
person Mārtiņš Možeiko    schedule 29.06.2012
comment
Если это внутреннее, оно не должно быть общедоступным, и мне не должно быть позволено вызывать его. - person kaalus; 05.07.2012
comment
Это общедоступный API, но вы несете ответственность за его правильное использование. Вы можете выбирать между перегрузкой массива (для нескольких значений), перегрузкой out (для одного возвращаемого значения, когда вы не хотите выделять одноэлементный массив) и перегрузкой небезопасного указателя (полезно для распределения данных без GC .) - person The Fiddler; 22.01.2014