Каков размер C # структуры для представления вершин в OpenGL (OpenTK)? - PullRequest
0 голосов
/ 14 сентября 2018

В настоящее время я экспериментирую с OpenGL (через OpenTK) в C #. Я просмотрел несколько уроков и часто обнаруживал, что структуры используются для описать вершину.

struct ColoredVertex
{
    public const int Size = (3 + 4) * 4;

    private readonly Vector3 position;
    private readonly Color4 color;

    public ColoredVertex(Vector3 position, Color4 color)
    {
        this.position = position;
        this.color = color;
    }
}

Тогда я спросил себя, почему они не используют функцию sizeof () C # и заметил, что он не работает на конструкциях из-за упаковки или около того.

Хорошо, но разве это не проблема? Если я думаю правильно, использование GL.BufferData для загрузки массива ColoredVertex в GPU с шагом ColoredVertex.Size может привести к неправильной интерпретации данных, поскольку CLR может принять решение использовать другую упаковку для массива структуры. Я прав?

Итак, как лучше всего сообщить OpenGL о макете Vertex? Использование Marshal.sizeof или небезопасного блока, как предлагает компилятор?

CS0233  'Vec3' does not have a predefined size, therefore sizeof can
only be used in an unsafe context (consider using
System.Runtime.InteropServices.Marshal.SizeOf)

1 Ответ

0 голосов
/ 15 сентября 2018

Примените атрибут [StructLayout(LayoutKind.Explicit)] к структуре, а затем примените [FieldOffset(n)] к каждому полю, чтобы расположить его в выбранной вами позиции байта, n.

Это дает вам детальный контроль позиции,и поскольку размеры примитивных типов в C # не зависят от платформы (64 против 32 бит), что также говорит о размере и полной компоновке.

...