SharpGL學習筆記(一) 平臺構建與Opengl的hello World (轉)

(一)平臺構建與Opengl的hello Worldwindows

 

OpenGL就是3d繪圖的API,微軟針和它競爭推出D3D,也就是玩遊戲時最多見的DirectorX組件中的3d功能。 因此不要期望windows提供對Opengl提供最新的什麼支持。緩存

C#的開發環境也沒有封裝Opengl的組件,Opengl的官方的dll是供C,C++開發用的。要想用在C#中你得本身導入DLL函數。但我相信你不會這樣作的,仍是引入第三方的Opengl庫來得方便。框架

 

SharpGL就是C#用的OpenGL庫,之因此選擇它,是由於它最後更新的時間較近,網上的C++教程也最多,並且這個庫是有成功的商業開發應用的,能夠放心使用。函數

源碼下載地址:this

http://www.oschina.net/p/sharpglspa

 

引用網上對SharpGL的評價,筆者說幾句:.net

對於第1點,能支持wpf程序,筆者很贊。3d

對於第2點,顯然是以訛傳訛,筆者爲此跑了一個sharpgl程序幾個小時,也沒看到有什麼內存增加。因此應該是當前版本把之前的內存泄露問題給解決了。至因而最先哪一個版本給解決的,我就不得而知了。code

對於第4點,顯然對筆者無所謂。orm

許多人去選擇OpenTK,若是他不是去開發OpenGL ES的話,那麼多半是懼怕內存泄露而不選擇SharpGL。

顯然說來講去仍是需求來肯定你該選擇什麼,若是開發OpenGL ES,你只能選擇OpengTK,不然若是隻是作windows平臺的開發,SharpGL和OpengTK均可以選擇。

複製代碼
 對SharpGL的總結以下:

    (1)安裝部署方便,能夠很是容易的集成到Windows Forms和WPF中去使用; (2)存在內存泄露的問題,即便運行一個簡單的程序,內存在不斷增加,當增加到了必定時就不會有太多的增加,因爲例程都有這樣的問題,對於咱們本身編寫程序,應做適當考慮; (3)目前SharpGL已經支持到OpenGL4.2(http://sharpgl.codeplex.com/discussions/431042),在全部的第三方庫中,其支持的OpenGL版本應該是最高的; 4)不支持Linux和Mac平臺(http://sharpgl.codeplex.com/discussions/356490)
複製代碼

 

 

 

 至於OpenGL能幹嗎? 對於博主來講,學它是出於須要,想作3D仿真, 也許你很年青,有大把業餘時間,那就能夠用它來寫個CS來爽爽。但博主仍是認爲學東西要以經濟效益和工做須要兩種力量爲驅動力,不然就不要學,在這個知識爆表的年代,其實頗有必須提倡節約時間,儘可能把時間用在刀刃上的。

 

 咱們用vs2010的C#,構建一個空白的windows窗體應用程序

 

首先,把 下載的SharpGL裏面的3個dll(除serialization.dll)引入C#,而後「選擇項」 選擇SharpGL.Winforms.dll , 就能夠在面板上看到4個控件。其中OpenGLControl就能夠把它播放到Form上去。它至關於Opengl的畫板。

 

 

若是你把OpenGLControl拖放到Form上時不幸出現下面這樣的畫面。

那麼多半是由於你用的vs2010,默認框架是.Net Framework 4 Client profile, 請切換爲.Net Framework 4就行了。

若是不是這個緣由,那麼你運行程序看看有沒有問題,若是能看到黑色的OpenGLControl控件,那麼你保存下這個工程,從新打開應該就行了。

至於爲何會這樣,筆者也不清楚。

 

源代碼以下:已經作了詳細解釋

複製代碼
 1 using System;  2 using System.Windows.Forms;  3 using SharpGL;  4  5 namespace blankTest  6 {  7 public partial class Form1 : Form  8  {  9 10 public Form1() 11  { 12  InitializeComponent(); 13 14  } 15 16 private void Form1_Load(object sender, EventArgs e) 17  { 18 19  } 20 21 private void openGLControl1_OpenGLInitialized(object sender, EventArgs e) 22  { 23 OpenGL gl = openGLControl1.OpenGL; 24 gl.ClearColor(0, 0, 0, 0); 25  } 26 27 private void openGLControl1_Resize(object sender, EventArgs e) 28  { 29 OpenGL gl = openGLControl1.OpenGL; 30 31 // 設置當前矩陣模式,對投影矩陣應用隨後的矩陣操做 32  gl.MatrixMode(OpenGL.GL_PROJECTION); 33 34 // 重置當前指定的矩陣爲單位矩陣,將當前的用戶座標系的原點移到了屏幕中心 35  gl.LoadIdentity(); 36 37 // 建立透視投影變換 38 gl.Perspective(30.0f, (double)Width / (double)Height, 5, 100.0); 39 40 // 視點變換 41 gl.LookAt(-5, 5, -5, 0, 0, 0, 0, 1, 0); 42 43 // 設置當前矩陣爲模型視圖矩陣 44  gl.MatrixMode(OpenGL.GL_MODELVIEW); 45  } 46 47 private void openGLControl1_OpenGLDraw(object sender, PaintEventArgs e) 48  { 49 SharpGL.OpenGL gl = this.openGLControl1.OpenGL; 50 //清除深度緩存 51 gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); 52 53 //重置當前指定的矩陣爲單位矩陣,將當前的用戶座標系的原點移到了屏幕中心 54  gl.LoadIdentity(); 55 56 //座標軸變換位置到(-1.5,0,-6) 57 gl.Translate(-1.5f, 0f, -6f); 58 59  gl.Begin(OpenGL.GL_TRIANGLES); 60  { 61 //頂點 62 gl.Vertex(0.0f, 1.0f, 0.0f); 63 //左端點 64 gl.Vertex(-1.0f, -1.0f, 0.0f); 65 //右端點 66 gl.Vertex(1.0f, -1.0f, 0.0f); 67  } 68  gl.End(); 69 70 //把當前座標系右移3個單位,注意此時是相對上面(-1.5,0,-6)點定位 71  gl.Translate(3f, 0f, 0f); 72 73  gl.Begin(OpenGL.GL_QUADS); 74  { 75 gl.Vertex(-1.0f, 1.0f, 0.0f); 76 gl.Vertex(1.0f, 1.0f, 0.0f); 77 gl.Vertex(1.0f, -1.0f, 0.0f); 78 gl.Vertex(-1.0f, -1.0f, 0.0f); 79  } 80  gl.End(); 81 gl.Flush(); //強制刷新 82 83  } 84  } 85 }
複製代碼

 

openGLControl1_OpenGLInitialized,
openGLControl1_Resiz,
openGLControl1_OpenGLDraw
這三個都是控件 openGLControl1 的自帶標準事件。
效果就像下圖這樣了。

 

 整這許多代碼,卻看到畫出這個東西,是否是有些小失望? 不知道和GDI+有什麼不一樣,對吧?

其實,不一樣的是,GDI+是純2D的, 而上面這兩個基礎圖形可不是2D,而是在3D空間的,雖然它只是一個片,可是也能夠在x,y,z方向任意旋轉哦。

 

 

 本例雖然簡單,仍是附上源代碼吧! 省得搞不出來影響心情。 ^_^

 

本節源代碼下載

 

原創文章,出自"博客園, 豬悟能'S博客" : http://www.cnblogs.com/hackpig/

相關文章
相關標籤/搜索