微软提供较少的标准支持,对于和他们竞争的东西—比如CORBA(COM的竞争对手)和OpenGL(DirectX的竞争对手)。
不过在C#中实现Opengl也并非没有可能,有很多很好的第3方库可以使用,这里列举2个。
(1)CsGL
http://csgl.sourceforge.net/index.html
名气较大的opengl库,有稳定版本。sf上的项目地址http://sourceforge.net/project/showfiles.php?group_id=33241。
目前有多个3D引擎项目使用的这个库。
(2)CSopenGL
http://www.ia.hiof.no/gb/ptools/csharp/p-csharp.html
有较详细的文档和例子。sf上的项目地址http://sourceforge.net/project/showfiles.php?group_id=54966&package_id=49782。
CSopenGL的一个例子(我在VS2005上编译)
-------form1.cs-------
| 以下是引用片段: #region Using directives using System; using System.Collections.Generic; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using CSOpenGL; #endregion namespace opentest { partial class Form1 : System.Windows.Forms.Form { //private System.ComponentModel.Container components = null; private GLView view; public Form1() { InitializeComponent(); view = new GLView(); view.Parent = this; view.CreateControl(); view.Dock = DockStyle.Fill; view._OnPaint = new Painter(); } /* protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } view.Dispose(); } base.Dispose(disposing); } */ private void Form1_Load(object sender, EventArgs e) { } } public class Painter : GLViewPainter { public Painter() { } public override void Paint(GLView view) { glViewport(0, 0, view.Width, view.Height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45.0f, 1.0f, 0.1f, 100.0f); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); //drawPyramid(); //drawSphere(); drawCube(); glFlush(); } private void drawPyramid() { glLoadIdentity(); glTranslatef(-0.2f, 0.3f, -4.0f); glRotatef(45.0f, 1.0f, 1.0f, 1.0f); glBegin(GL_TRIANGLES); // front face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); // right face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); //back face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(1.0f, -1.0f, -1.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // left face triangle: glColor3f(1.0f, 0.0f, 0.0f); glVertex3f(0.0f, 1.0f, 0.0f); glColor3f(0.0f, 0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glEnd(); } private void drawCube() { // enable color blending: glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glLoadIdentity(); glTranslatef(0.0f, 0.2f, -6.0f); glRotatef(45.0f, 1.0f, 1.0f, 1.0f); glBegin(GL_QUADS); // tegner først de sidene som ikke skal være gjennomsiktige: //the back: glColor4f(1.0f, 1.0f, 0.0f, 1.0f); // yellow glVertex3f(1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(1.0f, 1.0f, -1.0f); //the bottom: glColor4f(1.0f, 0.5f, 0.0f, 1.0f); // orange glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(1.0f, -1.0f, -1.0f); //the right face: glColor4f(1.0f, 0.0f, 1.0f, 0.75f); // cyan glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, -1.0f); // de sidene som skal være gjennomsiktige: // setter DepthBuffer read-only: glDepthMask(0); //the front: glColor4f(1.0f, 0.0f, 0.0f, 0.75f); // red glVertex3f(1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glVertex3f(1.0f, -1.0f, 1.0f); //the top: glColor4f(0.0f, 1.0f, 0.0f, 0.75f); // green glVertex3f(1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(1.0f, 1.0f, 1.0f); //the left face: glColor4f(0.0f, 0.0f, 1.0f, 0.75f); // blue glVertex3f(-1.0f, 1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glEnd(); glDepthMask(1); glDisable(GL_BLEND); } private void drawSphere() { float[] ambient = { 1.0f, 1.0f, 0.0f, 1.0f }; float[] diffuse = { 1.0f, 1.0f, 0.0f, 1.0f }; float[] specular = { 1.0f, 1.0f, 1.0f, 1.0f }; float[] position = { 4.0f, 0.0f, 6.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, specular); glLightfv(GL_LIGHT0, GL_POSITION, position); glEnable(GL_LIGHT0); glEnable(GL_LIGHTING); gluLookAt(-4.0, -5.0, 6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0); IntPtr hdc = gluNewQuadric(); gluSphere(hdc, 2.0, 40, 40); gluDeleteQuadric(hdc); } } } -------------program.cs-------------- #region Using directives using System; using System.Collections.Generic; using System.Windows.Forms; #endregion namespace opentest { static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.EnableRTLMirroring(); Application.Run(new Form1()); } } } |