(一)平台構建與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
至於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就好了。

源代碼如下:已經做了詳細解釋
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方向任意旋轉哦。
本例雖然簡單,還是附上源代碼吧! 免得搞不出來影響心情。 ^_^
本節源代碼下載