• 【转】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

  • 相关阅读:
    Pipe
    An Easy Problem?!
    Kadj Squares
    Space Ant
    Intersection
    让网页变为可编辑状态
    typescript入门基础
    大家都能看懂的 canvas基础教程
    数组的foreach方法和jQuery中的each方法
    html单行、多行文本溢出隐藏
  • 原文地址:https://www.cnblogs.com/ppffs/p/3078832.html
Copyright © 2020-2023  润新知