C# OpenTK-VBO和网格,内存异常

C# OpenTK-VBO和网格,内存异常,c#,opengl,opentk,C#,Opengl,Opentk,我有一个类,我试图用它绘制一个三角形,但它一直失败,我不知道为什么,有人能发现问题吗?我尝试过使用静态和动态vbo,但我一直遇到内存问题 我收到的错误是: " OpenTK.dll中发生类型为“System.AccessViolationException”的未处理异常 其他信息:试图读取或写入受保护的内存。这通常表示其他内存已损坏。 " 我的用法是: var m = new Mesh(); m.Vertices = new float[] {

我有一个类,我试图用它绘制一个三角形,但它一直失败,我不知道为什么,有人能发现问题吗?我尝试过使用静态和动态vbo,但我一直遇到内存问题

我收到的错误是:

" OpenTK.dll中发生类型为“System.AccessViolationException”的未处理异常

其他信息:试图读取或写入受保护的内存。这通常表示其他内存已损坏。 "

我的用法是:

        var m = new Mesh();

        m.Vertices = new float[] { 
            0, 0, 0, 
            5, 0, 0, 
            5, 5, 0
        };


        m._Indices = new ushort[] { 0, 1, 2 };
        m.Init();
我的班级是

namespace lolGL
{
    using System;
    using OpenTK.Graphics.OpenGL;
    using OpenTK;

    public class Mesh : Entity
    {
        public ushort[] _Indices = null;

        int m_vertexBuffer = 0;
        int m_indexBuffer = 0;

        bool use16BitIndices
        {
            get { return Vertices.Length <= 65536; }
        }

        public Mesh() { }

        public void Init()
        {
            GL.GenBuffers(1, out m_vertexBuffer);
            GL.BindBuffer(BufferTarget.ArrayBuffer, m_vertexBuffer);
            GL.BufferData(BufferTarget.ArrayBuffer, new IntPtr(BlittableValueType.StrideOf<float>(Vertices) * Vertices.Length), Vertices, BufferUsageHint.StaticDraw);

            GL.GenBuffers(1, out m_indexBuffer);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, m_indexBuffer);

            int indexSize = use16BitIndices ? sizeof(short) : sizeof(int);

            GL.BufferData(BufferTarget.ElementArrayBuffer, new IntPtr(indexSize * _Indices.Length), _Indices, BufferUsageHint.StaticDraw);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
        }

        public override void Render(OpenTK.FrameEventArgs e)
        {
            GL.BindBuffer(BufferTarget.ArrayBuffer, m_vertexBuffer);
            GL.BindBuffer(BufferTarget.ArrayBuffer, m_indexBuffer);

            GL.EnableClientState(ArrayCap.VertexArray);
            GL.VertexPointer(3, VertexPointerType.Float, Vector3.SizeInBytes, 0);

            if (use16BitIndices)
                GL.DrawElements(BeginMode.TriangleStrip, _Indices.Length, DrawElementsType.UnsignedShort, 0);
            else
                GL.DrawElements(BeginMode.TriangleStrip, _Indices.Length, DrawElementsType.UnsignedInt, 0);

            GL.Disable(EnableCap.VertexArray);

            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
            GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);

        }

        public override void EmptyBuffer()
        {
            Vertices = null;
            _Indices = null;
        }

        public override void Dispose()
        {
            EmptyBuffer();
        }

        public override void Delete()
        {
            if (m_indexBuffer != 0)
                GL.DeleteBuffers(1, ref m_indexBuffer);

            if (m_vertexBuffer != 0)
                GL.DeleteBuffers(1, ref m_vertexBuffer);

            Dispose();
        }

        public override void ApplyColorMap(int[] colors)
        {
            throw new NotImplementedException();
        }
    }
}
gl
{
使用制度;
使用OpenTK.Graphics.OpenGL;
使用OpenTK;
公共类网格:实体
{
公共ushort[]_索引=null;
int m_vertexBuffer=0;
int m_indexBuffer=0;
布尔使用16比特
{

获取{return Vertices.Length在渲染函数中,您将索引缓冲区绑定到错误的目标

GL.BindBuffer(BufferTarget.ArrayBuffer, m_indexBuffer);
应该是:

GL.BindBuffer(BufferTarget.ElementArrayBuffer, m_indexBuffer);
根据你最后解绑的方式,这可能只是一个打字错误


另外,与此无关,但您使用
use16BitIndices
所做的全部操作都是错误的。重要的不是数组的长度,而是数组中每个元素的大小。如果您有超过
65536
个顶点,则需要大于
65536
(一个
ushort
无法处理)。在这种情况下,您需要上传一个
int[]

关于另一个问题:请不要,请参阅例如@TobiasKienzler My bad,我以后会更加小心这些编辑。谢谢理解:)