zoukankan      html  css  js  c++  java
  • 【转】C#+csgl库进行OpenGL编程

    OpenGL是图形硬件的一个软件接口,是一种快速、高质量的3D图形软件。它提供了近120个绘制点、线点多边形等3D图形的命令,可以完成绘制物体、变换、光照处理、着色、反走样、融合、雾化、位图和图像、纹理映射、动画等基本操作,通过把这一系列基本操作进行组合,可以构造更复杂的3D物体和描绘丰富多彩、千变万化的客观世界。

           C#是以Microsoft.NET运行库为基础的一种编程语言,它几乎集中了所有关于软件开发和软件工程研究的最新成果,如面向对象、类型安全等,并被寄希望成为微软发布的用于企业编写基于COM+和视窗系统的程序语言中的最好的一种。与C++相比,C#的语法更加简洁,调试更加容易,且应用程序开发周期短。把C#和
    OpenGL结合起来开发3D应用程序和软件,将显著提高开发效率。

            在C#中,程序间的依赖项通过符号而不是文本来控制,因而不使用头文件,而且opengl32.dll以及opengl32.lib等文件也不能像在C++中那样进行部署和引用,所以,无法直接使用OpenGL所提供的图形库。

            在C#中通过调用OpenGL 动态链接库文件:csgl.dll和csgl.native.dll实现OpenGL所提供的强大的图形功能。 这2个文件可以从csgl.sourceforge.net网页上获取。

            csgl.dll中定义了4个名称空间,即CsGL,CsGL.OpenGL,CsGL.Pointers,CsGL.Util,其中,CsGL.OpenGL定义的4个类OpenGL、GL、GLU、GLUT中封装了几乎所有的OpenGL函数、用户库函数、辅助库函数和实用库函数及常量;类OpenGLControl中定义了OpenGL场景绘制函数,如场景的初始化、场景的绘制函数等;类OpenGLContext中定义了OpenGL环境控制命令,如像素格式、调色板的创建等命令。CsGL.Util定义了键盘、鼠标事件及异常处理等。

              为了能够使用这2个文件,先将这2个文件拷贝到系统文件夹%systemroot%╲system32中,然后在项目的属性页对话框中将"引用路径"设置为系统文件夹%systemroot%╲system32,这样C#就可以找到运行/调试应用程序所需要的库文件。

               下面是如何在VS2005环境下实现OpneGL建模:

    1、usingCsGL.OpenGL;

    2、新建一个类派生于OpenGLControl类的控件类,类OpenGLControl中还定义了设备初始化函数InitGLContext、场景绘制函数glDraw、双缓存交换函数SwapBuffers以及窗口大小改变时的重绘函数OnSizeChanged等。

    3、重写控件类的方法

    class Class_GL_View : CsGL.OpenGL.OpenGLControl
    
    {
    
            //重写绘图函数
            public override void glDraw()
    
            //初始化OpenGl控件
            protected override void InitGLContext()
    
            //当控件大小改变时候
            protected override void OnSizeChanged(EventArgs e)
    
            //OpenGL控件鼠标事件
            protected override void OnMouseMove(MouseEventArgs e)
    
            ..........................
    
    }

    4、在窗口中调用OpenGL控件类,即将控件添加到窗口上面

            public Control_GL_View = new Control_GL();
    
            public Form_main()
            {
                InitializeComponent();
                this.timer1.Start();
                this.ClientSize = new System.Drawing.Size(600, 400);
                view.Parent = this;
                view.BringToFront();
                view.Dock = DockStyle.Fill;
                this.Controls.Add(view);
            }

    C#不直接支持openGL,但可以利用第三方插件CsGL.dll实现. 现在和大家分享一下我的小程序:

    创建project "testOpenGL";

    然后添加一个继承OpenGLControl的类MyView,代码如下,

    namespace testOpenGL
    {
        class MyView : OpenGLControl
        {
            public MyView()
            { }
    
            public override void glDraw()
            {
                GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT
                    | GL.GL_ACCUM_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT);
                //绘制点
                GL.glColor3f(0.0f, 0.0f, 0.0f);
                GL.glPointSize(4.0f);
                GL.glBegin(GL.GL_POINTS);
                {
                    GL.glVertex2i(100, 50);
                    GL.glVertex2i(100, 130);
                    GL.glVertex2i(150, 130);
                    GL.glVertex2i(10, 10);
                    GL.glVertex2i(0, 0);         
                }
                GL.glEnd();
                //绘制线
                GL.glColor3f(1, 0, 0);
                GL.glLineWidth(2f);
                GL.glBegin(GL.GL_LINE_STRIP);
                {
                    GL.glVertex2i(100, 50);
                    GL.glVertex2i(100, 130);
                    GL.glVertex2i(150, 130);
                    GL.glVertex2i(10, 10);
                    GL.glVertex2i(0, 0);      
                }
                GL.glEnd();
                GL.glFlush();
            }
            //重构GL
            protected override void InitGLContext() 
            { 
                GL.glClearColor(1.0f, 1.0f, 1.0f, 0.0f);            
                GL.glMatrixMode(GL.GL_PROJECTION);
                GL.glLoadIdentity();
                GL.gluOrtho2D(0.0, Size.Width, 0.0, Size.Height);            
            
            }       
        }

    接着设置窗体,留意工具箱(toolBox)会发现多了一个自定义控件MyView. 在窗体添加一个MyView, 就可以运行了,运行结果是在viewCls这个控件内绘制了几个点和直线,

    本文来源:http://www.gisall.com/html/27/9027-2654.html

  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 完美的代价
    Java实现 蓝桥杯VIP基础练习 矩形面积交
    Java实现 蓝桥杯VIP 基础练习 完美的代价
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    Java实现 蓝桥杯 蓝桥杯VIP 基础练习 数的读法
    核心思想:想清楚自己创业的目的(如果你没有自信提供一种更好的产品或服务,那就别做了,比如IM 电商 搜索)
    在Linux中如何利用backtrace信息解决问题
  • 原文地址:https://www.cnblogs.com/ppffs/p/3078832.html
Copyright © 2011-2022 走看看