OpenGL для класса VertexArrayObject


Он, кажется, играет иногда и я не уверен, если это связано с самим классом или как я использую его. Может кто-то подтвердить, что это "хорошо" реализация VertexArrayObject класса?

//The following code is public domain

public class VertexArray : GraphicsResource
{
    protected readonly int ID;
    DrawMode _drawMode;
    VertexLayout _vertexType;

    protected BufferUsageHint bufferUsage = BufferUsageHint.StaticDraw;
    int vertexCount;
    int vertexBufferID;

    public DrawMode DrawMode
    {
        get { return _drawMode; }
        set { _drawMode = value; }
    }
    public int VertexCount
    {
        get { return vertexCount; }
    }
    public BufferUsageHint BufferUsage
    {
        get { return bufferUsage; }
        set { bufferUsage = value; }
    }

    public VertexArray()
        : base()
    {
        ID = createVAO();
        disposed = false;
    }
    public VertexArray(DrawMode drawMode)
        : base()
    {
        _drawMode = drawMode;
        ID = createVAO();
        disposed = false;
    }
    int createVAO()
    {
        int id;
        GL.GenBuffers(1, out vertexBufferID);
        GL.GenVertexArrays(1, out id);
        GL.BindVertexArray(id);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferID);
        VenGFX.currentVAO = this;
        return id;
    }
    public void Bind()
    {
        if (vertexCount == 0)
            throw new Exception("Vertex buffer has no data, and therefore can't be used");
        if (disposed)
            throw new ObjectDisposedException(ToString());
        GL.BindVertexArray(ID);
        VenGFX.currentVAO = this;
    }
    public void SetData<T>(T[] Array) where T : struct, IVertex
    {
        GL.BindVertexArray(ID);
        if (Array.Length > 0 && Array[0].Layout != _vertexType)
            setVertexType(Array[0].Layout);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferID);
        GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(Array.Length * _vertexType.SizeInBytes), Array, bufferUsage);
        vertexCount = Array.Length;
        VenGFX.currentVAO = this;
    }
    public void SetData<T>(T[] Array, int length) where T : struct, IVertex
    {
        GL.BindVertexArray(ID);
        if (Array != null && Array.Length > 0 && Array[0].Layout != _vertexType)
            setVertexType(Array[0].Layout);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vertexBufferID);
        GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(length * _vertexType.SizeInBytes), Array, bufferUsage);
        vertexCount = length;
        VenGFX.currentVAO = this;
    }
    void setVertexType(VertexLayout layout)
    {
        _vertexType = layout;
        layout.Set();
    }
    protected override void Release()
    {
        if (VenGFX.currentVAO == this)
        {
            GL.BindVertexArray(0);
            VenGFX.currentVAO = null;
        }

        int id = ID;
        GL.DeleteBuffers(1, ref vertexBufferID);
        GL.DeleteVertexArrays(1, ref id);
    }
}

Рисовать то, что я пишу

if (mesh.VertexCount == 0)
    return;
if (currentVAO != mesh)
    mesh.Bind();

GL.DrawArrays((BeginMode)(int)mesh.DrawMode, 0, mesh.VertexCount);


804
5
задан 14 апреля 2011 в 12:04 Источник Поделиться
Комментарии
1 ответ

Я ничего не знаю об OpenGL и что правильное внедрение VertexArrayObject должен выглядеть, но у меня есть пару замечаний:


  • Мне нравится, что удостоверение частного поля только для чтения, ...но его именования нарушает правила именования для частных полей, которые должны быть либо код или параметр _id - глядя на других частных полей поля _id бы быть более последовательным.

  • Я не понимаю, почему другие поля vertexCount и vertexBufferID (должно быть vertexBufferId) не начинаются с символа подчеркивания, а также.

  • Вертикальный пробел между методов/членов не согласуются ни. Пропуск строки между } и следующий член, он будет дышать лучше.

public VertexArray()
: base()

В : основание() часть является избыточной. Базовый конструктор всегда вызывается.

В релиз() переопределить, вы делаете это:

    int id = ID;
GL.DeleteBuffers(1, ref vertexBufferID);
GL.DeleteVertexArrays(1, ref id);

Независимо от DeleteVertexArrays делает с ИД (прошел по ссылке), ты не делаешь ничего с [возможно] измененное значение, я предполагаю, что код - это только для чтения. Но это явно тот случай, где "почему" было бы хорошо объяснено с коротким комментарием.

Наконец, такие свойства, как значение drawmode , которые используют не только для чтения, резервное поле...

DrawMode _drawMode;
public DrawMode DrawMode
{
get { return _drawMode; }
set { _drawMode = value; }
}

...вероятно, будет лучше переписать как авто-свойства:

public DrawMode DrawMode { get; set; }
public BufferUsageHint BufferUsag { get; set; }
public int VertexCount { get; private set; }

6
ответ дан 13 февраля 2014 в 05:02 Источник Поделиться