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


Part 1:安装

首先,安装OpenTK。 这是一个非常简单的过程,可以参考官方教程,我这里推荐使用Nuget

打开自己喜欢的IDE(集成开发环境)。 我使用Visual Studio,但是MonoDevelop和SharpDevelop应该都可以正常工作。

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

Part 2: 编程

现在我们有一个空的项目。 我们首先要做的是打开Program.cs文件。现在这是一个基础类,什么都不做。我们将继续为我们的主要功能。要开始显示图形,我们需要制作GameWindow类型的子类。 添加一个名为“Game”的新类。 使它成为GameWindow的子类(您需要为OpenTK添加一个using指令才能使用该类)。

差不多是这样:

using OpenTK;
using OpenTK.Graphics.OpenGL;
using System; namespace OpentkTutorials
{
class Game : GameWindow
{
}
}

回到Program.cs,添加代码:

namespace OpentkTutorials
{
class Program
{
static void Main(string[] args)
{
using (var game = new Game())
{
game.Run(30.0);
}
}
}
}

运行就可以看到效果了:

这是一个空窗口,但是说明我们成功了。

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上找到。

Opentk教程系列-1绘制一个三角形的更多相关文章

  1. WebGL简易教程(三):绘制一个三角形(缓冲区对象)

    目录 1. 概述 2. 示例:绘制三角形 1) HelloTriangle.html 2) HelloTriangle.js 3) 缓冲区对象 (1) 创建缓冲区对象(gl.createBuffer( ...

  2. [Modern OpenGL系列(三)]用OpenGL绘制一个三角形

    本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...

  3. 【OpenGL4.0】GLSL渲染语言入门与VBO、VAO使用:绘制一个三角形 【转】

    http://blog.csdn.net/xiajun07061225/article/details/7628146 以前都是用Cg的,现在改用GLSL,又要重新学,不过两种语言很多都是相通的. 下 ...

  4. Unity3D学习笔记1——绘制一个三角形

    目录 1. 绪论 2. 概述 3. 详论 3.1. 准备 3.2. 实现 3.3. 解析 3.3.1. 场景树对象 3.3.2. 绘制方法 4. 结果 1. 绪论 最近想学习一下Unity3d,无奈发 ...

  5. OpenTK教程-2绘制一个三角形(正确的方法)

    上一个教程向我们展示了如何在屏幕上画一个三角形.但是,我说过,那是一种古老的方式,即使它能够正常运行,但是现在这已经不是"正确"的方式.上篇文章中我们将几何发送到GPU的方式是所谓 ...

  6. OpenTK教程-2绘制一个三角形(正确的方式)

    上一个教程向我们展示了如何在屏幕上画一个三角形.但是,我说过,那是一种古老的方式,即使它能够正常运行,但是现在这已经不是"正确"的方式.上篇文章中我们将几何发送到GPU的方式是所谓 ...

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

    OpenTK的官方文档是真心的少,他们把怎么去安装OpenTK说的很清楚,但是也就仅限于此,这有一篇learn opentk in 15的教程(链接已经失效,译者注),但是并不完美.你可以在15分钟内 ...

  8. Android快乐贪吃蛇游戏实战项目开发教程-03虚拟方向键(二)绘制一个三角形

    该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.绘制三角形 在上一篇文章中,我们已经新建了虚拟方向键的自定义控件Direct ...

  9. WebGL简易教程(七):绘制一个矩形体

    目录 1. 概述 2. 示例 2.1. 顶点索引绘制 2.2. MVP矩阵设置 2.2.1. 模型矩阵 2.2.2. 投影矩阵 2.2.3. 视图矩阵 2.2.4. MVP矩阵 3. 结果 4. 参考 ...

随机推荐

  1. 流行框架angular

    ---恢复内容开始--- 一.angular是什么 一款非常优秀的前端高级js框架,由谷歌团队负责开发 angular是通过新的属性和表达扩展了html angular可以构建一个单一页面应用程序(s ...

  2. NodeJS中的http模块

    利用http模块,nodejs可以开发服务器, 极大简化服务器的创建: var http = require("http"); //创建服务器 var server = http. ...

  3. Vsftpd3.0--FTP服务器搭建之本地用户篇

    Vsftpd3.0--FTP服务器搭建之本地用户篇 年4月10日 19:23 FTP服务在工作中是经用到的一种工具,可以实现上传下载等功能.那么今天我们来聊一聊FTP服务器使用本地用户登录的实现模式. ...

  4. java使用dom4j对XML进行CURD操作

    要使用dom4j必须导入两个jar包: dom4j-1.6.1.jar jaxen-1.1-beta-6.jar 使用dom4j新建一个XML文件: /** * 利用dom4j完成新增一个xml文件 ...

  5. springmvc(三) 参数绑定、

    前面两章就介绍了什么是springmvc,springmvc的框架原理,并且会简单的使用springmvc以及ssm的整合,从这一章节来看,就开始讲解springmvc的各种功能实现,慢慢消化 --W ...

  6. POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题)

    POJ 3207 Ikki's Story IV - Panda's Trick(2-sat问题) Description liympanda, one of Ikki's friend, likes ...

  7. CSS单位

    一.em单位:相对单位,相对于父级大小. <div class="fs"> 你看看我的字体大小 <div class="fs"> 你在看 ...

  8. css的背景background的相关属性

    今天需要做一个占满设备宽度的轮播图,这里作为demo仅展示一张图,下面分别是要操作的图片(这里做了缩放处理,实际的图比较大),以及要实现的效果图,很明显两者是不成比例的:      (图一)     ...

  9. Windows 10 IoT Serials 9 – 如何利用IoTCoreAudioControlTool改变设备的音频设备

    大家知道,在Windows 10 IoT Core上,如果用户外接了USB声卡.带有麦克风的摄像头之类的硬件,就会有多个音频设备可以用.但是,系统目前并没有提供直接的UI来设置音频的输入或者输出设备. ...

  10. 构建 MariaDB Galera Cluster 分布式数据库集群(二)

    MariaDB的安装 构建 MariaDB Galera Cluster之前,首先安装MariaDB,本文使用的版本是10.1 1.环境准备 主机: MariaDB01(192.168.56.102) ...