首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL对glDrawArrays()的无效操作

OpenGL对glDrawArrays()的无效操作
EN

Stack Overflow用户
提问于 2016-02-23 23:15:08
回答 2查看 692关注 0票数 0

我正在使用C#库运行一个Pencil.Gaming项目,它是GLFW的C#绑定,它使用OpenTK包装OpenGL函数。我试图在vbo中绘制一个顶点数组,一旦我到达GL.DrawArrays,当我调用GL.GetError()时,它会给出一个System.AccessViolationException和一个Invalid Operation错误。下面是Mesh类的代码,错误的尖叫是Visual。我试图绘制的对象和我的顶点类的副本也在下面。

代码语言:javascript
运行
复制
static Mesh mesh;
mesh = new Mesh();

Vertex[] data = new Vertex[] {new Vertex(new Vector3(-1,-1,0)),
                              new Vertex(new Vector3(0,1,0)),
                              new Vertex(new Vector3(1,-1,0))};

mesh.addVertices(data);
mesh.draw();

顶点级:

代码语言:javascript
运行
复制
struct Vertex
{
    public static readonly int SIZE = 3;

    private Vector3 position;

    public Vertex(Vector3 position)
    {
        this.position = position;
    }
}

网格类:

代码语言:javascript
运行
复制
using System;
using Pencil.Gaming.Graphics;
using Pencil.Gaming.MathUtils;

namespace Practicalis.Rendering
{
    class Mesh
    {
        private int size;
        private int vbo;

        public Mesh()
        {
            size = 0;

            GL.GenBuffers(size, out vbo);
        }

        public void addVertices(Vertex[] vertices)
        {
            size = vertices.Length * sizeof(float);

            GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)size, (IntPtr)vbo, BufferUsageHint.StaticDraw);
        }

        public void draw()
        {
            GL.EnableVertexAttribArray(0);

            GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, Vertex.SIZE * 4, 0);

            Console.WriteLine(GL.GetError());
            GL.DrawArrays(BeginMode.Triangles, 0, size);

            GL.DisableVertexAttribArray(0);
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-01 22:32:29

在AddVer格函数中,我没有传递我的实际顶点数组,只传递指向vbo的指针。适当的功能在下面。

代码语言:javascript
运行
复制
public void addVertices(Vertex[] vertices)
{
    size = vertices.Length * Vector3.SizeInBytes;
    Vector3[] vertsData = new Vector3[vertices.Length];

    GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);

    for (int i = 0; i < vertices.Length; i++)
        vertsData[i] = vertices[i].Position;

    GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)size, vertsData, BufferUsageHint.StaticDraw);
}
票数 0
EN

Stack Overflow用户

发布于 2016-02-24 09:09:00

代码语言:javascript
运行
复制
GL.GenBuffers(size, out vbo); 

在这行之前,您的尺寸为0。它至少应该是一个,因为这是要生成的缓冲区的数量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35590158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档