用C#开发opengl

http://www.ltesting.net/ceshi/ruanjianceshikaifajishu/rjcskfyy/dotnet/2007/0630/97945.html

http://gameres.com/

微软提供较少的标准支持,对于和他们竞争的东西—比如CORBA(COM的竞争对手)和OpenGL(DirectX的竞争对手)。 不过在C#中实现Opengl也并非没有可能,有很多很好的第3方库可以使用,这里列举2个。 

(1)CsGL http://csgl.sourceforge.net/index.html 名气较大的o


微软提供较少的标准支持,对于和他们竞争的东西—比如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://sourceforge.net/projects/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 
{ 
/// <summary> 
/// The main entry point for the application. 
/// </summary> 
[STAThread] 
static void Main() 
{ 
Application.EnableVisualStyles(); 
Application.EnableRTLMirroring(); 
Application.Run(new Form1()); 
} 
} 
} 

用第三方插件是CSGL,其官方网站为: http://csgl.sourceforge.net/
    关键是使用其提供的两个DLL:csgl.dll 和 csgl.native.dll,csgl.dll是开发使用的,在一个C#工程中,用“项目”->“添加引用”->“浏览”找到csgl.dll 引用。然后把两个dll都放到程序目录在运行时使用。
      在需要使用OpenGL函数的cs文件的using声明中,加上:using CsGL.OpenGL命名空间,就可以使用静态GL类调用OpenGL函数和变量了,比如GL.glRotatef
       而对于显示OpenGL窗口,需要自己建立一个从CsGL.OpenGL.OpenGLControl类继承的控制类,并至少做以下重构:

protected override void OnCreateControl()
{
   GL.glClearDepth(1.0f);
   GL.glDepthFunc(GL.GL_LEQUAL);
   GL.glEnable( GL.GL_DEPTH_TEST ); 
}

protected override void OnSizeChanged(EventArgs e)
{
   base.OnSizeChanged(e);

   Size s = Size;
   double aspect_ratio = (double)s.Width /(double) s.Height;
   ViewCtrl.VIEWSIZE_WIDTH = s.Width;
   ViewCtrl.VIEWSIZE_HEIGHT = s.Height;
   GL.glMatrixMode(GL.GL_PROJECTION);
   GL.glLoadIdentity();
   GL.gluPerspective(63.0f, aspect_ratio, 1f, 4000.0f);

   GL.glMatrixMode(GL.GL_MODELVIEW);
   GL.glLoadIdentity();
}

public override void glDraw()
{
   GL.glClearColor(0.1f,0.1f,0.2f,1.0f);
   GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
   GL.glLoadIdentity();
    }

(在glDraw()中动态绘制想画的东西)

然后捆绑到一个Form窗体上显示就可以:
如:声明:public class csglViewer : OpenGLControl
在窗体中实例化:csglViewer myview;
myview = new csglViewer();
myview.dock = DockStyle.Fill;
Form1.Controls.Add(myview);

OK~其实C#里面使用OpenGL跟C++没有太大区别,OpenGL毕竟是所谓平台无关的,那些函数基本上都是一致的。重点其实就是学OpenGL而不是什么语言的OpenGL,只要把接口(或者可以说显示OpenGL画面的窗口)找到就行了  

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1791625

===================

(3)其他开发包:OPENTK

http://sourceforge.net/projects/opentk/

  • The Open Toolkit library
  • The Open Toolkit library
  • The Open Toolkit library

还在支持。。。。非常不错。

有最新版本呢。

具体实例.跟着下面的网站..很有名的..作者的态度太让人佩服了.. 
http://nehe.gamedev.net/               左边的   OpenGL   Tutorials   ..   一定要仔细的学 

线性代数不好..看下面的网站. 
http://chortle.ccsu.edu/VectorLessons/vectorIndex.html 

openGL   官方红书手册 
http://www.parallab.uib.no/SGI_bookshelves/SGI_Developer/books/OpenGL_RM/sgi_html/bk02.html 

如果有不懂的wgl   glut   glu   函数   去   http://msdn.microsoft.com/library/   查 



SharpGL: A C# OpenGL Class Library

By  Dave Kerr | 23 Feb 2012 |  Article
Use OpenGL in WinForms or WPF applications, directly or with a powerful Scene Graph.
 
Part of  The WPF / Silverlight Zone  sponsored by 
See Also
   Discuss  252  
Is your email address OK? You are signed up for our newsletters but your email address is either unconfirmed, or has not been reconfirmed in a long time. Please click  here to have a confirmation email sent so we can confirm your email address and start sending you newsletters again. Alternatively, you can update your subscriptions.
Add your own
alternative version

跨平台的引擎,ANDROID,WINDOWS ,LINUX.


http://sourceforge.net/projects/softpixelengine/files/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值