如何在C#上开发OpenGL

 微软提供较少的标准支持,对于和他们竞争的东西—比如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());


  }


  }


  }

你可能感兴趣的:(C#,职场,OpenGL,休闲)