OpenTK抗锯齿
如果不进行抗锯齿的操作,OpenTK绘制的图是很粗糙的。而实际上OpenTK默认采用了抗锯齿,但在没有缓冲区的情况下,抗锯齿功能无法实现。下面的代码用来开启抗锯齿,虽说是默认的,为了保险也可以写一下,代码如下:
GL.Enable(EnableCap.LineSmooth);
GL.Hint(HintTarget.LineSmoothHint, HintMode.Nicest);
GL.Enable(EnableCap.PointSmooth);
GL.Hint(HintTarget.PointSmoothHint, HintMode.Nicest);
申请缓冲区的两种方法
第一种方法,对GLControl类进行继承。
public class GLControl1
: GLControl
{
public GLControl1()
: base(new GraphicsMode(32, 24, 8, 8))
{ }
}
在InitializeComponent函数中,找到:
this.glControl1 = new OpenTK.GLControl();
修改为:
this.glControl1 = new GLControl1();
这个方法参考自:https://stackoom.com/question/40pRq中的回答
链接中是在创建窗口时创建缓冲区,但有时我们需要在GLControl上进行画图,因此可以采用本文的方法,在创建GLControl控件时申请缓冲区。
第二种方法,在创建实例时申请缓冲区
this.glControl1 = new OpenTK.GLControl(new GraphicsMode(32, 24, 8, 8));
这个方法更加简单。
这两种方法都会带来一个问题,就是在设计界面会报错,但是不影响运行。建议在设计界面构造完后再添加申请缓冲区的代码。
抗锯齿的前后变化
抗锯齿前
抗锯齿后
吐槽
之前就是想实现类似matlab的mesh功能,已经用C#的Graphics画出来并且能够实现交互式的旋转。
但是发现三维空间中的遮盖问题太难处理,这才准备用OpenGL来处理。没想到OpenTK这玩意资料也太少了,这个抗锯齿的问题困扰了好久,一直找不到合适的资料。OpenTK感觉是配置起来最简单的,没想到后续的学习成本这么大。
学到这里,做个记录,希望能够帮助到大家。