OpenTK的官方文檔是真心的少,他們把怎麼去安裝OpenTK說的很清楚,可是也就僅限於此,這有一篇learn opentk in 15的教程(連接已經失效,譯者注),可是並不完美。你能夠在15分鐘內作一些簡單的事情,可是卻很難理解代碼的內部機制。本文使用了一部分該教程的代碼,使用的是過期的方式(非VBO),可是有助於理解OPENTK/OPENGL的繪圖機制。html
首先,安裝OpenTK。 這是一個很是簡單的過程,能夠參考官方教程,我這裏推薦使用Nuget
。git
打開本身喜歡的IDE(集成開發環境)。 我使用Visual Studio,可是MonoDevelop和SharpDevelop應該均可以正常工做。github
新建一個控制檯(console)程序,右鍵點擊工程,管理nuget引用,輸入opentk,安裝就ok了。編程
如今咱們有一個空的項目。 咱們首先要作的是打開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上找到。