软件频道>程序开发>JavaVBVCDelphiC/C++Web开发微软专栏移动数据库程序人生软件工程|开发客
您现在的位置: 天极网 > 开发频道 > 如何用C#开发opengl
全文

如何用C#开发opengl

2008-04-09 15:40作者:互连网 出处:天极网责任编辑:孙蓬阳

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

相关搜索:
关注此文读者还看过
文章排行
本周
本月
最近更新
关于我们|About us|网站律师|天极服务|电子杂志|RSS订阅|加入我们|网站地图
TMG
Copyright (C) 1999-2009 Chinabyte.com, All Rights Reserved 版权所有 天极网络
商务联系、网站内容、合作建议:010-82657868
版权声明 在线提交意见反馈 渝ICP证B2-20030003号
经营性网站备案信息 网警备案 中国网站排名
天极传媒:天极网|比特网|IT专家网|IT商网|52PK游戏网|IT分众