OpenTK教程-1绘制一个三角形

OpenTK的官方文档是真心的少,他们把怎么去安装OpenTK说的很清楚,可是也就仅限于此,这有一篇learn opentk in 15的教程(连接已经失效,译者注),可是并不完美。你能够在15分钟内作一些简单的事情,可是却很难理解代码的内部机制。本文使用了一部分该教程的代码,使用的是过期的方式(非VBO),可是有助于理解OPENTK/OPENGL的绘图机制。html


Part 1:安装

首先,安装OpenTK。 这是一个很是简单的过程,能够参考官方教程,我这里推荐使用Nugetgit

打开本身喜欢的IDE(集成开发环境)。 我使用Visual Studio,可是MonoDevelop和SharpDevelop应该均可以正常工做。github

新建一个控制台(console)程序,右键点击工程,管理nuget引用,输入opentk,安装就ok了。编程

Part 2: 编程

如今咱们有一个空的项目。 咱们首先要作的是打开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上找到。

相关文章
相关标签/搜索