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


 

(一)平台構建與Opengl的hello World

 

OpenGL就是3d繪圖的API,微軟針和它競爭推出D3D,也就是玩游戲時最常見的DirectorX組件中的3d功能。 所以不要指望windows提供對Opengl提供最新的什么支持。

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

 

SharpGL就是C#用的OpenGL庫,之所以選擇它,是因為它最后更新的時間較近,網上的C++教程也最多,而且這個庫是有成功的商業開發應用的,可以放心使用。

源碼下載地址:

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

 

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

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

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

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

許多人去選擇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/

 


免責聲明!

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



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