Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenTK-VertexBufferObject不';我什么也不画_C#_Vbo_Opentk - Fatal编程技术网

C# OpenTK-VertexBufferObject不';我什么也不画

C# OpenTK-VertexBufferObject不';我什么也不画,c#,vbo,opentk,C#,Vbo,Opentk,我正在尝试学习如何在C#OpenTK中使用VBOs进行绘图-下面的示例包括和 我很确定我想要这样的交错单数组方法,每个顶点都有一个整洁的结构。我得到的代码编译没有错误,但它只是画了一个空白的棕色屏幕,没有白色三角形。我肯定我犯了一个愚蠢的错误,请帮我从中吸取教训 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; us

我正在尝试学习如何在C#OpenTK中使用VBOs进行绘图-下面的示例包括和

我很确定我想要这样的交错单数组方法,每个顶点都有一个整洁的结构。我得到的代码编译没有错误,但它只是画了一个空白的棕色屏幕,没有白色三角形。我肯定我犯了一个愚蠢的错误,请帮我从中吸取教训

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.OpenGL;
using OpenTK.Input;
using System.Drawing;
using System.Runtime.InteropServices;

namespace VBOTest2
{
    [StructLayout(LayoutKind.Sequential)]
    public struct Vertex
    {
        public Vector3 Position;
        public byte[] Colour;

        public Vertex(byte[] colour, Vector3 position)
        {
            Colour = colour;
            Position = position;
        }

        public static readonly int Stride = Marshal.SizeOf(default(Vertex));
    }

    public class VBOTest2 : GameWindow
    {
        uint vbo;

        public VBOTest2() :
            base(1, 1, new GraphicsMode(32, 24, 8, 0), "Test")
        {
            Width = 1500;
            Height = 800;
            VSync = VSyncMode.On;
            ClientSize = new Size(1500, 800);
            this.Location = new System.Drawing.Point(100, 300);
            GL.Viewport(0, 0, Width, Height);
        }

        void CreateVertexBuffer()
        {
            Vertex[] vertices = new Vertex[3];
            vertices[0] = new Vertex(new byte[]{255,255,255,255}, new Vector3(-1f, -1f, 0f));
            vertices[1] = new Vertex(new byte[] { 255, 255, 255, 255 }, new Vector3(1f, -1f, 0f));
            vertices[2] = new Vertex(new byte[] { 255, 255, 255, 255 }, new Vector3(0f, 1f, 0f));

            GL.GenBuffers(1, out vbo);
            GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
            GL.BufferData<Vertex>(BufferTarget.ArrayBuffer, (IntPtr)Vertex.Stride, vertices, BufferUsageHint.StaticDraw);           
        }

        protected override void OnLoad(EventArgs e)
        {
            GL.ClearColor(Color.Brown);
            CreateVertexBuffer();
        }


        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);
            GL.Clear(ClearBufferMask.ColorBufferBit);

            GL.EnableClientState(ArrayCap.VertexArray);
            GL.EnableClientState(ArrayCap.ColorArray);

            GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);

            GL.VertexPointer(3, VertexPointerType.Float, Vertex.Stride, (IntPtr)(0));
            GL.ColorPointer(4, ColorPointerType.UnsignedByte, Vertex.Stride, (IntPtr)(3 * sizeof(float)));

            GL.DrawArrays(PrimitiveType.Triangles, 0, 3);

            //release buffer
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);

            GL.DisableClientState(ArrayCap.VertexArray);
            GL.DisableClientState(ArrayCap.ColorArray);

            SwapBuffers();
        }
    }

}   
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用OpenTK;
使用OpenTK.Graphics;
使用OpenTK.Graphics.OpenGL;
使用OpenTK.Input;
使用系统图;
使用System.Runtime.InteropServices;
命名空间VBOTest2
{
[StructLayout(LayoutKind.Sequential)]
公共结构顶点
{
公共向量3位置;
公共色彩;
公共顶点(字节[]颜色,矢量3位置)
{
颜色=颜色;
位置=位置;
}
public static readonly int Stride=Marshal.SizeOf(默认值(顶点));
}
公共类VBOTest2:游戏窗口
{
uint vbo;
公共VBOTest2():
基本(1,1,新图形模式(32,24,8,0),“测试”)
{
宽度=1500;
高度=800;
VSync=VSyncMode.On;
ClientSize=新尺寸(1500800);
该位置=新系统图纸点(100300);
总图视口(0,0,宽度,高度);
}
void CreateVertexBuffer()
{
顶点[]顶点=新顶点[3];
顶点[0]=新顶点(新字节[]{255255},新向量3(-1f,-1f,0f));
顶点[1]=新顶点(新字节[]{255,255,255},新向量3(1f,-1f,0f));
顶点[2]=新顶点(新字节[]{255,255,255},新向量3(0f,1f,0f));
GL.GenBuffers(1,输出vbo);
GL.BindBuffer(BufferTarget.ArrayBuffer,vbo);
GL.BufferData(BufferTarget.ArrayBuffer,(IntPtr)Vertex.Stride,Vertex,BufferUsageHint.StaticDraw);
}
受保护的覆盖无效加载(事件参数e)
{
GL.ClearColor(颜色为棕色);
CreateVertexBuffer();
}
RenderFrame上受保护的覆盖无效(FrameEventArgs e)
{
基于渲染帧(e);
GL.Clear(ClearBufferMask.ColorBufferBit);
GL.EnableClientState(ArrayCap.VertexArray);
GL.EnableClientState(ArrayCap.ColorArray);
GL.BindBuffer(BufferTarget.ArrayBuffer,vbo);
顶点间距(3,顶点间距,浮点型,顶点间距,(IntPtr)(0));
GL.ColorPointer(4,ColorPointerType.UnsignedByte,Vertex.Stride,(IntPtr)(3*sizeof(float));
GL.DrawArray(基本类型.三角形,0,3);
//释放缓冲区
GL.BindBuffer(BufferTarget.ArrayBuffer,0);
总账DisableClientState(ArrayCap.VertexArray);
GL.DisableClientState(ArrayCap.ColorArray);
SwapBuffers();
}
}
}