OpenTK的官方文档是真心的少,他们把怎么去安装OpenTK说的很清楚,可是也就仅限于此,这有一篇learn opentk in 15的教程(连接已经失效,译者注),可是并不完美。你能够在15分钟内作一些简单的事情,可是却很难理解代码的内部机制。本文使用了一部分该教程的代码,使用的是过期的方式(非VBO),可是有助于理解OPENTK/OPENGL的绘图机制。html
首先,安装OpenTK。 这是一个很是简单的过程,能够参考官方教程,我这里推荐使用Nuget
。git
打开本身喜欢的IDE(集成开发环境)。 我使用Visual Studio,可是MonoDevelop和SharpDevelop应该均可以正常工做。github
新建一个控制台(console)程序,右键点击工程,管理nuget引用,输入opentk,安装就ok了。编程
如今咱们有一个空的项目。 咱们首先要作的是打开Program.cs文件。如今这是一个基础类,什么都不作。咱们将继续为咱们的主要功能。要开始显示图形,咱们须要制做GameWindow类型的子类。 添加一个名为“Game”的新类。 使它成为GameWindow的子类(您须要为OpenTK添加一个using指令才能使用该类)。c#
差很少是这样:windows
using OpenTK; using OpenTK.Graphics.OpenGL; using System; namespace OpentkTutorials { class Game : GameWindow { } }
回到Program.cs,添加代码:ide
namespace OpentkTutorials { class Program { static void Main(string[] args) { using (var game = new Game()) { game.Run(30.0); } } } }
运行就能够看到效果了:
函数
这是一个空窗口,可是说明咱们成功了。spa
GameWindow的Run方法有多个重载。使用30.0的float类型参数,Run函数会以30次/秒的频率引起窗口的UpdateFrame事件,一样的,计算机将处理相同频率的RenderFrame事件。翻译
如今,咱们来让窗口作一些更有趣的事情。 在Game类中,您可使用几种方法来重载以添加新功能。 咱们要重载的第一个是onLoad。若是您使用Visual Studio,只需输入“override”并添加一个空格便可给出一个可用于覆盖的GameWindow类中的方法列表。此方法的基本形式为:
protected override void OnLoad(EventArgs e) { base.OnLoad(e); }
咱们再写点别的:
protected override void OnLoad(EventArgs e) { base.OnLoad(e); //修改窗口标题 Title = "Hello OpenTK!"; //设置背景颜色为,额,不知道什么蓝(须要添加 OpenTK.Graphics.OpenGL and System.Drawing引用) GL.ClearColor(Color.CornflowerBlue); }
咱们必须再作一件事情,而后才会看到这种颜色变化。 使用如下代码为OnRenderFrame方法添加另外一个重载:
protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); SwapBuffers(); }
先上车,之后再解释这部分。咱们应该能看到修改效果:
如今的背景是蓝色,标题也改过来了。
接下来,当正确调整窗口大小时,咱们将添加代码来处理。咱们须要告诉OpenGL如何调整新窗口大小,因此咱们须要一些处理它的代码。
protected override void OnResize(EventArgs e) { base.OnResize(e); GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height); Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, Width / (float)Height, 1.0f, 64.0f); GL.MatrixMode(MatrixMode.Projection); GL.LoadMatrix(ref projection); }
这段代码只是告诉OpenGL窗口的位置,以及咱们想要绘制的窗口。如今这些不重要,可是当咱们实际绘制一些东西,或者作一个真实的游戏时,处理大小调整将很是重要。
咱们回到OnRenderFrame
方法,并实际绘制一些东西。 咱们须要作的第一件事就是告诉OpenGL咱们正在从哪一个方向看。由于咱们实际上有可能会在3D中制做一些东西,因此咱们面对的方向(视角)很重要。
在调用SwapBuffers()
以前,下一节的全部代码将进入OnRenderFrame
。 这是由于咱们须要画一些东西才能交换缓冲区。默认状况,咱们使用“双缓冲”设置。 当咱们要把东西画到屏幕上时,咱们首先绘制一个“缓冲区”,后来被“交换”到屏幕内容。 这样能够确保在屏幕更新以前,全部内容都会在屏幕上绘制出来。
如下代码将在准备一个平面,咱们能够在上面画三角形。
Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY); GL.MatrixMode(MatrixMode.Modelview); GL.LoadMatrix(ref modelview);
如今咱们要画三角形自己。 第一步是告诉OpenGL咱们想画些东西。 咱们用GL.Begin函数作到这一点。 它须要一个参数,即便用的绘图模式。 能够选择绘制四边形,三角形,点,多边形和“条”。 咱们只是使用一个三角形,因此咱们须要的代码是:
GL.Begin(BeginMode.Triangles);
BeginMode有如下几种模式,(如今调用这个方法会显示已通过时,须要使用PrimitiveType代替)能够参考OPENGL文档,或者园子里有人写过:
http://www.cnblogs.com/helloj2ee/archive/2013/03/12/2956181.html
如今咱们已经告诉OPENTK如何绘制,咱们须要给它形状的顶点。 为此,咱们使用GL.Vertex3函数。3D空间中单个点的坐标须要三个浮点数。
GL.Vertex3(-1.0f, -1.0f, 4.0f); GL.Vertex3(1.0f, -1.0f, 4.0f); GL.Vertex3(0.0f, 1.0f, 4.0f);
在将全部点送到显卡以前,咱们须要告诉OPENGL咱们打完收工了。
GL.End();
跑完,应该是这个效果:
咱们再深刻一步,添加一点色彩。使用GL.Color3函数,能够设置定点颜色,须要在设置位置以前调用。
GL.Color3(1.0f, 0.0f, 0.0f); GL.Vertex3(-1.0f, -1.0f, 4.0f); GL.Color3(0.0f, 1.0f, 0.0f); GL.Vertex3(1.0f, -1.0f, 4.0f); GL.Color3(0.0f, 0.0f, 1.0f); GL.Vertex3(0.0f, 1.0f, 4.0f);
最后效果差很少是这样:
为何它是一个渐变的三角形? 这是因咱们使用的是默认着色器(shader)。着色器容许许多很是惊人的效果,例如凹凸贴图,照明,phong光照等。默认值在绘制顶点时简单地插入给它们的颜色和位置的值。着色器是一个更复杂的功能(甚至使用本身的脚本语言),之后咱们会讲到。
本系列教程翻译自Neo Kabuto's Blog。已经取得做者受权。
本文原文地址http://neokabuto.blogspot.com/2013/02/opentk-tutorial-1-opening-windows-and.html
原文代码能够在github上找到。