OpenTK:仅在屏幕中间显示一个点而不是图形

时间:2020-03-26 19:49:23

标签: c# winforms opengl opentk

我正在尝试使用OpenTK和Winforms绘制一维列表的图形。我需要绘制数百万个数据,所以我更喜欢将数据保存为列表而不是数组。我不确定opengl是否仅接受ptrs来数组。另外,当尝试将1d列表更改为vec3时(使用EditVertices函数),我感觉可能做错了。目前,我正在运行一小部分清单作为概念测试。

public GraphWIndow () : base(800, 600, default, "Data Analyzer", GameWindowFlags.Default, default,4,0, default)
        {
        var test = new List<double> { 1, 22, 0.87, 4, 5 };
        List<double> list1 =  EditVertices(test);
        GCHandle handle1 = GCHandle.Alloc(list1);
        parameter = (IntPtr)handle1;
        }


protected override void OnLoad(EventArgs e)
        {
            CursorVisible = true;
            shader = new Shader("shader.vert", "shader.frag");
            VertexArrayObject = GL.GenVertexArray();
            VertexBufferObject = GL.GenBuffer();
            GL.BindVertexArray(VertexArrayObject);
            GL.BindBuffer(BufferTarget.ArrayBuffer, VertexBufferObject);
            GL.BufferData(BufferTarget.ArrayBuffer, 5 * sizeof(double), parameter, BufferUsageHint.StaticDraw);
            //GL.bu(BufferTarget.ArrayBuffer, (IntPtr)0, 5, parameter);
            GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Double, false, 3 * sizeof(double), 0);
            GL.EnableVertexAttribArray(0);

            }
protected override void OnRenderFrame(FrameEventArgs e)
        {
            GL.ClearColor(Color4.DarkBlue);
            GL.Clear(ClearBufferMask.ColorBufferBit);


           // GL.UseProgram(;
            GL.UseProgram(shader.Use());
            GL.BindVertexArray(VertexArrayObject);
            GL.DrawArrays(PrimitiveType.Points,0, 5);
            GL.PointSize(10);
            SwapBuffers();
        }

private List<double> EditVertices(List<double> list)
        {
            List<double> list2d = new List<double>();
            for(int i =0; i<list.Count(); i++)
            {
                list2d.Add(i/(list.Count()));
                list2d.Add((list[i]-list.Min())/(list.Max()-list.Min()));
                list2d.Add(0);
            }
            return list;
        }

我在单独的类中编译着色器:

  public class Shader
    {
        int Handle, VertexShader, FragmentShader;

        public Shader(string vertexPath, string fragmentPath)
        {
            string FragmentShaderSource, VertexShaderSource;
            using (StreamReader reader = new StreamReader(vertexPath, Encoding.UTF8))
            {
                VertexShaderSource = reader.ReadToEnd();
            }
            using (StreamReader reader = new StreamReader(fragmentPath, Encoding.UTF8))
            {
                FragmentShaderSource = reader.ReadToEnd();
            }

            VertexShader = GL.CreateShader(ShaderType.VertexShader);
            GL.ShaderSource(VertexShader, VertexShaderSource);
            FragmentShader = GL.CreateShader(ShaderType.FragmentShader);
            GL.ShaderSource(FragmentShader, FragmentShaderSource);
            GL.CompileShader(VertexShader);

            string infoLogVert = GL.GetShaderInfoLog(VertexShader);
            if (infoLogVert != System.String.Empty)
                System.Console.WriteLine(infoLogVert);

            GL.CompileShader(FragmentShader);

            string infoLogFrag = GL.GetShaderInfoLog(FragmentShader);
            if (infoLogFrag != System.String.Empty)
                System.Console.WriteLine(infoLogFrag);

            Handle = GL.CreateProgram();
            GL.AttachShader(Handle, VertexShader);
            GL.AttachShader(Handle, FragmentShader);
            GL.LinkProgram(Handle);
            GL.DetachShader(Handle, VertexShader);
            GL.DetachShader(Handle, FragmentShader);
            GL.DeleteShader(FragmentShader);
            GL.DeleteShader(VertexShader);

        }
        public int  Use()
        {
            return Handle;
        }

顶点着色器:

 #version 400 core
    layout (location = 0) in vec3 aPosition;
void main()
{
    gl_Position = vec4(aPosition.x, aPosition.y, aPosition.z, 1.0f);
}

片段着色器:

#version 400 core
out vec4 FragColor;

void main()
{
    FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}

我在蓝屏中间看到一个橙色的圆点。不知道我错过了什么。

0 个答案:

没有答案