浅谈OpenGL渲染¶
固定管线和着色器¶
最近因为需要使用OpenTK绘制刀路图,所以简单了解了一下OpenGL的渲染机制。
老版的渲染机制是固定管线性,举个简单例子,以下代码的绘图方式就是固定管线:
private void DrawLine(float[] v1, float[] v2)
{
GL.Begin(PrimitiveType.Lines); // 开始绘制线型图形
GL.Vertex3(v1[0], v1[1], v1[2]); // 线的起点
GL.Vertex3(v2[0], v2[1], v2[2]); // 线的终点
GL.End(); // 结束绘制线型图形
}
就是先定义一个基本形状,然后给几个点就画出这个形状。其实跟Matplotlib的绘图方式很像,缺点是速度慢且灵活性不够。
后来就开发了个基于着色器的渲染,详细教程可以看你好,三角形 - LearnOpenGL CN,里面讲的很清楚,主要是要记住并理解什么VAO、VBO、IBO之类的概念,渲染速度快但是写起来复杂点。
OpenTk.GLControl的坐标变换¶
回归到C#的OpenTK.GLControl控件中,当我们创建一个窗口时,可以用ViewPort()函数指定控件显示窗口的大小。
然后开始分析一下坐标变换过程,假设我们想绘制一个三角形,然后有自己定义的三个顶点坐标,这时这三个坐标是处于local space(局部坐标系下),渲染的第一步就会把这几个点从局部坐标系转到世界坐标系(模型变换,用户无需指定,应该是系统内定了一个世界原点)。接着要将坐标从世界坐标系转到观察坐标系(也可以叫摄像机坐标系),即变成以摄像机为原点,朝某个方向观察得到的坐标,这个变换过程叫做视图变换(通过指定相机位置可以完成该变换)。然后再将观察坐标系转换为裁剪坐标系,通常是3D转2D,这个变换叫投影变化,分为正交投影和透视投影两种,正交投影不存在近大远小,但是透视投影存在。最后再从裁剪坐标系转换到屏幕坐标系,叫视口变换(好像是根据之前指定的窗口大小来变换的)。