用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/

### C# 中使用 OpenGL 进行 3D 图形开发C#中利用OpenGL进行3D图形开发是一项强大且灵活的选择,尤其适合于那些希望构建高性能图形应用程序的人士。下面提供一段具体的代码片段来说明如何在一个简单的场景中初始化并渲染一个三维物体——即一个旋转的立方体。 #### 初始化环境与设置 为了能够顺利地操作OpenGL,在项目启动之初需引入必要的命名空间: ```csharp using OpenTK; using OpenTK.Graphics.OpenGL; ``` 接着定义窗口类及其构造函数,完成基本配置工作,比如设定背景颜色以及开启深度测试等功能特性,这对于正确显示复杂几何形状至关重要[^1]。 #### 创建顶点数据结构 对于要绘制的对象而言,其表面由多个多边形构成;每个这样的面都至少拥有三个顶点位置信息。因此,先建立描述这些特征的数据集是非常重要的一步。考虑到效率问题,通常会采用数组形式存储坐标值,并将其传递给GPU以便后续高效访问。 ```csharp float[] vertices = { // 前面 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, ... (其余各面省略) }; ``` #### 编写着色器程序 现代OpenGL依赖于可编程管线模型,其中最重要的组成部分就是着色器脚本。它们负责计算最终像素的颜色和其他属性。此处仅给出最简化版本的位置变换逻辑作为示范用途。 ```glsl // Vertex Shader Code #version 330 core layout(location = 0) in vec3 aPos; uniform mat4 model; uniform mat4 view; uniform mat4 projection; void main() { gl_Position = projection * view * model * vec4(aPos, 1.0); } ``` ```glsl // Fragment Shader Code #version 330 core out vec4 FragColor; void main() { FragColor = vec4(1.0); // 白色光亮 } ``` #### 实现渲染过程 最后,在每一帧更新期间执行实际绘图命令之前,还需要指定当前使用的着色器资源、上传顶点资料至显存当中形成缓冲区对象(Buffer Object),并通过适当的方式激活相应的纹理单元(Texture Unit)等准备工作。当一切就绪之后,则可以调用`DrawElements()`方法正式开始绘制流程了。 ```csharp public override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); shader.Use(); // 设置变换矩阵... GL.BindVertexArray(VAO); GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0); } protected override void OnResize(EventArgs e) { base.OnResize(e); GL.Viewport(ClientRectangle.X, ClientRectangle.Y, Width, Height); } ``` 上述例子只是冰山一角,真正完整的3D游戏或模拟软件往往涉及更多高级概念和技术细节,如光照效果、材质贴图、碰撞检测等等。不过掌握了基础原理后,进一步探索也就变得更加容易了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值