从本文起,将开始将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/