使用OpenTK和C#可视化N体代码的输出

时间:2015-02-20 19:54:41

标签: c# opengl graphics opentk vertex

我在C#中编写了一个N体代码,它输出一个包含N个对象的x,y,z位置的数组。我想使用OpenTK逐帧渲染它。

基本上,我需要弄清楚如何使用VBO-s创建顶点数组,在屏幕上显示它,并定期更新它。由于我没有图形经验,我试图修改我在网上找到的一个例子,它适用于一个顶点,但不适用于数组。

以下是代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Threading;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using OpenTK.Platform;
using System.Drawing;

namespace OpenTK
{
class Program : GameWindow

{

    int vbo;

    void CreateVertexBuffer()
    {
        Vector3[] vertices = new Vector3[2];
        vertices[0] = new Vector3(0f, 0f, 0f);
        vertices[1] = new Vector3(1f, 7f, 6f);

        GL.GenBuffers(1, out vbo);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
        GL.BufferData<Vector3>(BufferTarget.ArrayBuffer,
                               new IntPtr(vertices.Length * Vector3.SizeInBytes),
                               vertices, BufferUsageHint.StaticDraw);
    }

    protected override void OnLoad(EventArgs e)
    {
        GL.ClearColor(0,0,0,0);
        GL.PointSize(5f);
        CreateVertexBuffer();
    }

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

        GL.EnableVertexAttribArray(0);
        GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
        GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0);

        GL.DrawArrays(BeginMode.Points, 0, 1);

        GL.DisableVertexAttribArray(0);

        SwapBuffers();
    }


    public static void Main(string[] args)
    {
        using (Program p = new Program())
        {
            p.Run(60);
        }
    }
}
}

1 个答案:

答案 0 :(得分:1)

有一些事情可以解决:

  • 第二个顶点坐标错误。它必须在[-1,1]范围内归一化。您可以在创建数组时执行此操作,也可以在顶点着色器中进行转换
  • 您似乎没有着色器
  • 你只画了一个点,第一个点。

我建议通过this tutorial series,这是一个很好的学习资源。虽然它使用C ++,但概念完全相同,而且函数名也几乎相同