第1部分:安装
首先,安装OpenTK。这是一个相当简单的过程,安装程序使它非常简单。现在,打开使用C#的.NET IDE(集成开发环境)。我使用Visual Studio,但MonoDevelop和SharpDevelop都应该可以正常工作。创建控制台项目,右击项目“管理Nuget程序包”添加对“OpenTK”的引用。
第2部分:编码
现在我们有一个基础的空项目。我们首先要做的是打开Program.cs文件。现在它是一个基本的类,什么都不做。要开始显示任何内容,我们需要创建一个GameWindow 类型的子类 。添加一个名为“Game”的新类。使它成为GameWindow的子类(您需要为OpenTK添加using指令才能使用该类)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenTK;
namespace OpenTKTutorial1
{
class Game: GameWindow
{
}
}
现在我们让窗口显示出来。返回Program.cs,并将以下代码添加到Main函数:
using (Game game = new Game())
{
game.Run(30.0);
}
如果你运行这段代码,你会看到一个弹出的窗口!

虽然还是一片空白,但肯定是有进步。GameWindow的Run方法有多个重载。使用一个float参数,Run方法会以每秒30次的速度调用UpdateFrame和RenderFrame事件。现在,让我们让那个窗口做一些更有趣的事情。在Game类中,您可以使用一些方法来重写以添加新功能。我们将重写的第一个是onLoad。如果你正在使用Visual Studio(我不能肯定地说其他IDE),只需输入“override”并添加一个空格就会给你一个GameWindow类中可用于重写的方法列表。此方法的基本形式为:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}
我们要改变的第一件事是窗口的标题。这个代码非常简单:
Title = "Hello OpenTK!";
与此同时,我们也可以将背景改为浅蓝色。同样,这段代码非常简单:
GL.ClearColor(Color.CornflowerBlue);
(注意:要添加它,你需要使用OpenTK.Graphics.OpenGL和System.Drawing的using指令)OpenTK还为我们提供了通过其组件指定颜色的选项,但为了简单起见我使用的是来自C#Color类内置的预设颜色。所以现在,OnLoad方法应如下所示:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
Title = "Hello OpenTK!";
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, lientRectangle.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);
既然我们已经告诉它我们想要绘制的方式,我们需要为它的形状设置顶点。为此,我们使用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);
如果你运行它,你会看到以下内容:

为什么它是线性渐变的三角形?这是因为使用了默认着色器。着色器允许许多非常惊人的效果,例如凹凸贴图,光照,phong等。默认情况下,只需在绘制顶点时为颜色和位置赋予它们的值之间进行插值。着色器是一个更复杂的功能(甚至使用他们自己的脚本语言),显然它们可能是未来教程的内容。
1146

被折叠的 条评论
为什么被折叠?



