轉、修改自ShareIdeas文章C# 基於CSGL openglhtml
OpenGL是一個功能強大的開放圖形庫(Open Graphics Library)。其前身是SGI公司爲其圖形工做站開發的IRIS GL。爲使其可以更加容易地移植到不一樣的硬件和操做系統,SGI開發了OpenGL。從程序開發人員的角度來看,OpenGL是一組繪圖命令的API集合。利用這些API可以方便地描述二維和三維幾何物體,並控制這些物體按某種方式繪製到顯示緩衝區中。OpenGL的API集提供了物體描述、平移、旋轉、縮放、光照、紋理、材質、像素、位圖、文字、交互以及提升顯示性能等方面的功能,基本涵蓋了開發2、三維圖形程序所需的各個方面。git
我這裏用到的是CsGl框架,CsGL是openGL在.NET下的包裝。能夠在網上下載:目前關於CsGL的開發基本上已經中止,官方主頁上的github
說法是認爲CsGL對大多數應用而言已經足夠穩定了,目前CsGL開發工做基本上集中在Example程序的撰寫.主要文件列表以下:編程
代碼說明:這裏主要是編寫OpenGLBase 這個類的代碼:框架
/// <summary> /// 新建一個類,由於C#不容許多重繼承 /// </summary> class OpenGLBase : OpenGLControl { } // OpenGLBase類中主要包括下面一些方法:
// 1.建立屏幕刷新計時器回調函數,每10ms刷新一次OpenGL窗口 private void Timer_GLupdate_Tick(object sender, EventArgs e){ this.Invalidate(); } //2.建立按鍵響應計時器回調函數,(按照我的需求添加),響應按鍵信息,能夠按須要修改. private void OpenGLBase_KeyDown(object sender, KeyEventArgs e){} //3.窗口大小改變時發生(窗體加載的時候會運行一次) protected override void OnSizeChanged(EventArgs e) {} //4. OpenGL初始化場景 protected override void InitGLContext() {}
//5. OpenGL繪製函數,繪圖代碼都在這裏完成 public override void glDraw() {
}
下面是完整OpenGLBase類的原碼,代碼來自NEHE教程。ide
using System; using System.Collections.Generic; using System.Linq; using System.Text; using CsGL.OpenGL; using System.Windows.Forms; namespace CsGl_Tri_squ { /// <summary> /// 新建一個類,由於C#不容許多重繼承 /// </summary> class OpenGLBase : OpenGLControl { //Timer Timer_GLupdate = new Timer();窗口重繪計時器 Timer Timer_GLupdate = new Timer();// 窗口重繪計時器 private static float rtri = 0; // Angle For The Triangle private static float rquad = 0; // Angle For The Quad public OpenGLBase() { this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick); this.Timer_GLupdate.Interval = 10; this.Timer_GLupdate.Start(); this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown); //委託 } //定時器觸發的方法 private void Timer_GLupdate_Tick(object sender, EventArgs e) { this.Invalidate(); } private void OpenGLBase_KeyDown(object sender, KeyEventArgs e) { switch (e.KeyCode) { case Keys.D: break; case Keys.A: break; case Keys.S: break; case Keys.W: break; default: break; } } /// <summary> /// 重寫窗體大小 改變方法 /// </summary> /// <param name="e"></param> protected override void OnSizeChanged(EventArgs e) { GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height); GL.glMatrixMode(GL.GL_PROJECTION); GL.glLoadIdentity(); GL.gluPerspective(40.0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0.1f, 500.0f); GL.glMatrixMode(GL.GL_MODELVIEW); } /// <summary> /// OnPaint方法處理Paint事件 /// </summary> /// <param name="pevent"></param> protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent) { base.OnPaint(pevent); //ToDo:可加入本身的設計代碼 } /// <summary> /// OpenGL初始化場景 /// </summary> protected override void InitGLContext() { base.InitGLContext(); GL.glEnable(GL.GL_DEPTH_TEST); // Enables Depth Testing // GL.glDepthFunc(GL.GL_LEQUAL); // The Type Of Depth Testing To Do // GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST); // Really Nice Perspective Calculations GL.glMatrixMode(GL.GL_PROJECTION); GL.glLoadIdentity();/ GL.gluPerspective(50.0, ((double)(this.Width) / (double)(this.Height)), 1.0, 1000.0); GL.glMatrixMode(GL.GL_MODELVIEW); GL.glLoadIdentity(); GL.glShadeModel(GL.GL_SMOOTH); } public override void glDraw() { // Here's Where We Do All The Drawing GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer GL.glLoadIdentity(); // Reset The Current Modelview Matrix,單位化 GL.glTranslatef(-1.5f, 0.0f, -6.0f); // Move Left 1.5 Units And Into The Screen GL.glRotatef(rtri, 0.0f, 1.0f, 0.0f); // 繞Y軸旋轉金字塔 rtri是角度 GL.glBegin(GL.GL_TRIANGLES); // Drawing Using Triangles //正對的面 GL.glColor3f(1.0f, 0.0f, 0.0f); // Red GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Front) GL.glColor3f(0.0f, 1.0f, 0.0f); // Green GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Left Of Triangle (Front) GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue GL.glVertex3f(1.0f, -1.0f, 1.0f); // Right Of Triangle (Front) //2 GL.glColor3f(1.0f, 0.0f, 0.0f); // Red GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Right) GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue GL.glVertex3f(1.0f, -1.0f, 1.0f); // Left Of Triangle (Right) GL.glColor3f(0.0f, 1.0f, 0.0f); // Green GL.glVertex3f(1.0f, -1.0f, -1.0f); // Right Of Triangle (Right) //3 GL.glColor3f(1.0f, 0.0f, 0.0f); // Red GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Back) GL.glColor3f(0.0f, 1.0f, 0.0f); // Green GL.glVertex3f(1.0f, -1.0f, -1.0f); // Left Of Triangle (Back) GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Right Of Triangle (Back) //4 GL.glColor3f(1.0f, 0.0f, 0.0f); // Red GL.glVertex3f(0.0f, 1.0f, 0.0f); // Top Of Triangle (Left) GL.glColor3f(0.0f, 0.0f, 1.0f); // Blue GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Left Of Triangle (Left) GL.glColor3f(0.0f, 1.0f, 0.0f); // Green GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Right Of Triangle (Left) GL.glEnd(); // Finished Drawing The Pyramid GL.glLoadIdentity(); // Reset The Current Modelview Matrix,回到中心位置 GL.glTranslatef(1.5f, 0.0f, -7.0f); // Move Right 1.5 Units And Into The Screen 7.0 GL.glRotatef(rquad, 1.0f, 1.0f, 1.0f); // Rotate The Quad On The X, Y, And Z Axes GL.glBegin(GL.GL_QUADS); // Draw A Quad //1 GL.glColor3f(0.0f, 1.0f, 0.0f); // Set The Color To Green GL.glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Top) GL.glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Top) GL.glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Quad (Top) GL.glVertex3f(1.0f, 1.0f, 1.0f); // Bottom Right Of The Quad (Top) //2 GL.glColor3f(1.0f, 0.5f, 0.0f); // Set The Color To Orange GL.glVertex3f(1.0f, -1.0f, 1.0f); // Top Right Of The Quad (Bottom) GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Top Left Of The Quad (Bottom) GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Bottom) GL.glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Bottom) //3 GL.glColor3f(1.0f, 0.0f, 0.0f); // Set The Color To Red GL.glVertex3f(1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Front) GL.glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Front) GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Front) GL.glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Right Of The Quad (Front) //4 GL.glColor3f(1.0f, 1.0f, 0.0f); // Set The Color To Yellow GL.glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Back) GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Back) GL.glVertex3f(-1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Back) GL.glVertex3f(1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Back) //5 GL.glColor3f(0.0f, 0.0f, 1.0f); // Set The Color To Blue GL.glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Quad (Left) GL.glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Quad (Left) GL.glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Quad (Left) GL.glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Quad (Left) //6 GL.glColor3f(1.0f, 0.0f, 1.0f); // Set The Color To Violet GL.glVertex3f(1.0f, 1.0f, -1.0f); // Top Right Of The Quad (Right) GL.glVertex3f(1.0f, 1.0f, 1.0f); // Top Left Of The Quad (Right) GL.glVertex3f(1.0f, -1.0f, 1.0f); // Bottom Left Of The Quad (Right) GL.glVertex3f(1.0f, -1.0f, -1.0f); // Bottom Right Of The Quad (Right) GL.glEnd(); // Done Drawing The Cube rtri += 0.6f; // Increase The Rotation Variable For The Triangle rquad += 0.6f; // Decrease The Rotation Variable For The Quad,單位是角度 } } }