Я пытаюсь построить график 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 оранжевую точку в середине синего экрана. Не уверен, что я пропустил.