OpenTK: просто показывает точку в середине экрана вместо графика - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь построить график 1-го списка, используя 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;
        }

Vertex Shader:

 #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);
}

Я вижу 1 оранжевую точку в середине синего экрана. Не уверен, что я пропустил.

...