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. OpenTK教程-2绘制一个三角形(正确的方法)

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

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

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

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

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

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

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

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

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

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

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

  7. Opentk教程系列-1绘制一个三角形

    本系列教程翻译自Neo Kabuto's Blog.已经取得作者授权. 本文原文地址http://neokabuto.blogspot.com/2013/02/opentk-tutorial-1-op ...

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

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

  9. Stage3D学习笔记(二):使用GPU绘制一个三角形

    我们需要使用到Adobe自家提供的AGALMiniAssembler代码类,可以在网下进行下载: 关于AGAL的入门知识可以参考下面的文章: AGAL介绍系列文章(第一部分)AGAL介绍系列文章(第二 ...

随机推荐

  1. ER模型试题

    M公司为了便于开展和管理各项业务活动,提高公司的知名度和影响力,拟构建一个基于网络的会议策划系统. [需求分析结果] 该系统的部分功能及初步需求分析的结果如下 : (1)M公司旗下有业务部.策划部和其 ...

  2. localStorage,sessionStorage的使用

    最近因为项目上需要使用到客户端存储,所以稍微研究了一下,以下说说自己的理解和使用经验 1.调用方法相同 各自都包含以下几种操作: //根据key获取对应的值; window.sessionStorag ...

  3. asp.net根据参数找不到记录后响应404及显示错误页

    在asp.net mvc 中,action方法里根据参数获取数据,假如获取的数据为空,为了响应404错误页,我们可以return HttpNotFound(); 但是在asp.net webform中 ...

  4. 关于MySQL checkpoint

    Ⅰ.Checkpoint 1.1 checkpoint的作用 缩短数据库的恢复时间 缓冲池不够用时,将脏页刷到磁盘 重做日志不可用时,刷新脏页 1.2 展开分析 page被缓存在bp中,page在bp ...

  5. https证书概念

    https://studygolang.com/articles/10776 http://www.360doc.com/content/15/0520/10/21412_471902987.shtm ...

  6. 【PAT】B1043 输出PATest(20 分)

    /* */ #include<stdio.h> #include<algorithm> #include<string.h> #include<ctype.h ...

  7. 【PAT】B1056 组合数的和(15 分)

    就看着代码量一直到没什么好说的了 #include<stdio.h> int main(){ int N,K;scanf("%d",&N); int sum=0 ...

  8. trap命令的实战用法

    trap命令: trap命令是专用于捕捉信号的.比如像ctrl+c发送给终端的中断信号等等.在捕捉到信号之后,可以进行一系列的操作. 用法:trap  'COMMAND' INT COMMAND表示t ...

  9. log4.net 配置 - StringMatchFilter过滤器的使用

    当我们需要对log4输出的内容进行过滤时就需要使用到StringMatchFilter过滤器 它有两种工作模式: 1.字符串查找模式:只要消息内容包含指定字符串则符合过滤器规则. 2.正则表达式模式: ...

  10. Resct配置less

    配置less 安装less-loader yarn add less-loader 打开 webpack.config.dev.js 和 webpack.config.prod.js 找到  test ...