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

相關文章
相關標籤/搜索