OpenTK教程-1繪制一個三角形


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM