Почему параметр данных в методе Gl.BufferSubData () OpenGL. NET является IntPtr? - PullRequest
1 голос
/ 25 апреля 2020

Я создаю игровой движок в c# с использованием OpenGL. NET. Сейчас я работаю над Batch Renderer. Основной метод пакетного рендеринга - glBufferSubData (). Но фактические данные, которые я предоставляю, находятся в форме QuadVertex [], тогда как метод запрашивает IntPtr !! Каким должен быть IntPtr ?? В C ++ мы можем предоставить void * там и в Java (LWJGL3) FloatBuffer. Есть ли способ конвертировать мой QuadVertex [] в IntPtr? Вот класс QuadVertex:

internal sealed class QuadVertex
{
    public vec3 Position;
    public vec4 Colour;
    public vec2 TexCoord;

    public static uint GetSize()
    {
        return (3 + 4 + 2) * 4;
    }
}

1 Ответ

1 голос
/ 25 апреля 2020

In OpenGL. Net Gl.BufferSubData перегружен. Аргумент data должен иметь тип IntPtr или тип object.
. Метод делегируется в glBufferSubData, где аргумент указывает указатель на последовательный байтовый массив, который содержит данные. .

Например, аргумент может быть либо массивом (любого типа, например: float):

var data = new float[] { ... };
Gl.BufferSubData(BufferTarget.ArrayBuffer, new IntPtr(0), (uint)(4 * data.Length), data);

Или вам нужно создать некоторую неуправляемую память (Marshal.AllocHGlobal) и скопировать некоторые данные (Marshal.Copy) в память:

IntPtr unmanagedPointer = Marshal.AllocHGlobal(size);
Marshal.Copy(..., 0, unmanagedPointer, size);
Gl.BufferSubData(BufferTarget.ArrayBuffer, new IntPtr(0), size, unmanagedPointer);
Marshal.FreeHGlobal(unmanagedPointer);

В качестве альтернативы подумайте о Buffer Mapping ( glMapBuffer).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...