我在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,1]范围内进行归一化。创建阵列时执行此操作,或者在顶点着色器中执行变换
- 看起来您没有着色器
- 您只绘制了一个点,即第一个点
我建议你浏览一下这个系列教程,它是一个很好的学习资源。尽管它使用C++,但概念完全相同,函数名称也几乎相同