Gl.VertexAttribPointer () не работает при указании целочисленного смещения, но работает при вводе null - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь создать игровой движок в C# и OpenGL, используя OpenGL. NET. Я абстрагировал базовые c объекты OpenGL, такие как VAO, VBO и др. c. У меня есть класс BufferLayout, который определяет данные, присутствующие в буфере вершин. Метод в классе VertexArray, который добавляет буфер: Это перегрузка, которая принимает object. Но по какой-то причине element.Offset работает не так, как ожидалось. Поскольку я использую только атрибут позиции для этого теста, он работает, когда я заменяю element.Offset на null.

Вот BufferLayout.cs

public enum ShaderDataType
{
    None,
    Float, Float2, Float3, Float4,
    Mat3, Mat4,
    Int, Int2, Int3, Int4,
}

public class BufferElement
{
    internal string Name;
    internal ShaderDataType Type;
    internal int Size;
    internal int Offset;
    internal bool Normalized;

    public BufferElement(ShaderDataType type, string name, bool normalized = false)
    {
        Name = name;
        Type = type;
        Size = Globals.ShaderDataTypeSize(type);
        Offset = 0;
        Normalized = normalized;
    }

    internal void SetOffset(int offset) => Offset = offset;

    public int GetComponentCount()
    {
        switch (Type)
        {
            case ShaderDataType.Float:      return 1;
            case ShaderDataType.Float2:     return 2;
            case ShaderDataType.Float3:     return 3;
            case ShaderDataType.Float4:     return 4;
            case ShaderDataType.Mat3:       return 3 * 3;
            case ShaderDataType.Mat4:       return 4 * 4;
            case ShaderDataType.Int:        return 1;
            case ShaderDataType.Int2:       return 2;
            case ShaderDataType.Int3:       return 3;
            case ShaderDataType.Int4:       return 4;
        }
        return 0;
    }
}

internal sealed class BufferLayout
{
    public List<BufferElement> Elements { get; private set; }

    public int Stride { get; private set; }

    public BufferLayout(BufferElement[] e)
    {
        Elements = new List<BufferElement>();
        Elements.AddRange(e);
        CalculateOffsetsAndStride();
    }

    private void CalculateOffsetsAndStride()
    {
        int offset = 0;
        Stride = 0;
        for (int i = 0; i < Elements.Count; i++)
        {
            Elements[0].SetOffset(offset);
            offset += Elements[0].Size;
            Stride += Elements[0].Size;
        }
    }
}

1 Ответ

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

Перегрузка, которая принимает объект, предназначена для профиля совместимости OpenGL contex , и объект должен быть объектом, содержащим данные массива вершин.

Если вы хотите установить смещение, тогда вы должны создать IntPtr. Например:

var offset = new IntPtr(element.Offset);
Gl.VertexAttribPointer(
    i++,
    element.GetComponentCount(),
    Globals.ShaderDataTypeToOpenGLBaseType(element.Type),
    element.Normalized,
    buffer.Layout.Stride,
    offset
);

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

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