OpenGL In C# 04 Nehe 第二课 绘制多边形

    从本文起,将开始将Nehe的OpenGL教程使用C#来进行一次实现。

    本实现都是以第三课的框架为基础,能够调用OpenGL函数、并能够进行字符串的绘制,以方便程序的显示。具体的字符串显示过程会在后面进行讲解。

    本课的内容是绘制一个三角形和一个正方形,窗体中按ESC将退出窗体,双击窗体将使其最大化,在最大化的同时双击将还原。

    前面几课中绘制的都是2D的内容,从本课开始将要开始绘制3D内容。在同一个显示空间内,可以同时绘制2D和3D的内容,这就像是油画一样,最后绘制的内容会掩盖最初绘制的内容。

    想要实现3D内容的绘制先要将投影矩阵设置为3D方式,使用gluPerspective设置观察视锥,使用glTranslatef函数来移动图像到合理的位置。

            //设置3D显示空间
            OpenGL.glViewport(0, 0, Width, Height);					// 重置当前的视口
            OpenGL.glMatrixMode(OpenGL.GL_PROJECTION);				// 选择投影矩阵
            OpenGL.glLoadIdentity();							    // 重置投影矩阵
	        //设置视口的大小
            OpenGL.gluPerspective(45.0f, Width / Height, 0.1f, 100.0f);
            OpenGL.glMatrixMode(OpenGL.GL_MODELVIEW);				// 选择模型观察矩阵
            OpenGL.glLoadIdentity();							    // 重置模型观察矩阵

            OpenGL.glColor4d(1.0, 1.0, 1.0, 1.0);                   // 设置白色
            OpenGL.glTranslatef(-1.5f, 0.0f, -6.0f);				// 左移 1.5 单位,并移入屏幕 6.0


   在这个位置进行三角形的绘制:

            OpenGL.glBegin(OpenGL.GL_TRIANGLES);					// 绘制三角形
            OpenGL.glVertex3f(0.0f, 1.0f, 0.0f);					// 上顶点
            OpenGL.glVertex3f(-1.0f, -1.0f, 0.0f);					// 左下
            OpenGL.glVertex3f(1.0f, -1.0f, 0.0f);					// 右下
            OpenGL.glEnd();								            // 三角形绘制结束


    然后再移动位置绘制正方形:

            OpenGL.glTranslatef(3.0f, 0.0f, 0.0f);					// 右移3单位
            OpenGL.glBegin(OpenGL.GL_QUADS);					    //  绘制正方形
            OpenGL.glVertex3f(-1.0f, 1.0f, 0.0f);					// 左上
            OpenGL.glVertex3f(1.0f, 1.0f, 0.0f);					// 右上
            OpenGL.glVertex3f(1.0f, -1.0f, 0.0f);					// 左下
            OpenGL.glVertex3f(-1.0f, -1.0f, 0.0f);					// 右下
            OpenGL.glEnd();


     最后将提示文字和FPS通过2D的方式绘制到屏幕上:

//设置2D显示的内容 绘制文字
            OpenGL.glMatrixMode(OpenGL.GL_PROJECTION);
            OpenGL.glLoadIdentity();
            OpenGL.gluOrtho2D(0.0, Width, 0.0, Height);
            OpenGL.glViewport(0, 0, Width, Height);
            OpenGL.glMatrixMode(OpenGL.GL_MODELVIEW);
            OpenGL.glLoadIdentity();
            //显示FPS
            string s = string.Format("Draw Time: {0:0.0000} ms ~ {1:0.0} FPS", frameTime, 1000.0 / frameTime);
            tDrawer.DrawText(s, new Point(30, 10), 24);

            //显示操作提示
            tDrawer.DrawText("ESC退出", new Point(10, ClientSize.Height - 20), 20);

            tDrawer.DrawText("双击切换全屏", new Point(10, ClientSize.Height - 40), 20);


    这样就在屏幕上绘制了3D的三角形和正方形,由于现在没有进行着色,并且没有光照,看起来是跟平面图形一样的,但是这已经是真正的3D图形了。

    对鼠标双击事件进行处理,加入全屏和返回的代码:

        /// <summary>
        /// 切换全屏显示
        /// </summary>
        private void Form1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            FullScreen = !FullScreen;
            if (FullScreen)
            {
                this.FormBorderStyle = FormBorderStyle.None;
                this.TopMost = true;
                this.WindowState = FormWindowState.Maximized;
            }
            else
            {
                this.FormBorderStyle = FormBorderStyle.Sizable;
                this.TopMost = false;
                this.WindowState = FormWindowState.Normal;
            }
        }


     这样就能够在全屏和普通样式之间进行切换了,最后在加上ESC退出(在按键事件中处理):

        /// <summary>
        /// 按键处理
        /// </summary>
        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            switch(e.KeyChar)
            {
                case (char)Keys.Escape:
                    this.Close();
                    break;
            }
        }


    本课的代码就完成了。

    工程下载地址:http://download.csdn.net/detail/tianyu2202/4369361

    原创内容,欢迎转载,请注明出处:http://blog.csdn.net/tianyu2202/

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值