哎,命苦啊,被斑竹拉来当苦力......
《OpenGL篇》
对于很多人来讲,说起OpenGL,首先便会想到游戏,特别是经典的FPS游戏Quake(雷神之锤)系列,它是有史以来最受欢迎的3D游戏之一,它的作者John Carmack 用一个星期使用OpenGL将其重新编写之后,引起了游戏界的一片喧哗。然而,游戏只是OpenGL应用领域的冰山一角。
严格的讲, OpenGL被定义为"图形硬件的一种软件接口",它是一种功能强大,精巧复杂的3D图形API(应用程序编程接口).OpenGL并不象C/C++一样是一门编程语言,从本质上说,它是一个3D图形和模型库,具有高度的可移植性,并且有非常快的速度.它拥有的命令超过300个,覆盖了从设置材料颜色和反射属性到执行旋转和复杂的坐标转换等功能.它具有比Direct3D更简洁的代码和更高的效率,但这也使向Direct3D投入了大量资金的微软公司感到利益受到威胁,而在初期大力打压OpenGL.然而,OpenGL强大的功能和易于使用的特点使得它得到了越来越多的开发人员的认可和支持,面对越来越多的受GpenGL支持的软件,硬件商们不得不开发更好的OpenGL硬件和高质量的驱动程序.今天,OpenGL已经得到了广泛的承认和接受,成为实时3D图形的行业标准API.
下面我们就来看看怎样用OpenGL来画一个点
考虑到很多人没有安装BC++6.0, 下面这个程序是用VC++6.0编译的。
以下是源代码
#include "glut.h"
//#include<gl/glut.h>
//绘制场景
void RenderScene(void)
{
// 用当前清除颜色清除窗口
glClear(GL_COLOR_BUFFER_BIT);
// 首先设置画图用的颜色,这里设置成了红色
// 红 绿 蓝
glColor3f(1.0f, 0.0f, 0.0f);
//这个函数的所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的
//有时为了表现象玻璃一样的透明效果,会用glColor4f(1.0f, 0.0f, 0.0f,1.0f);
//最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明
// 开始画图了,应斑竹大人的要求画一个点,不过一个点也太难找了吧,所以要画大点
//设置点的大小,默认大小是0,画出来的点很小,这里大小设置成3
glPointSize(3);
//设置成画点的模式
glBegin(GL_POINTS);
//glVertex3f(x,y,z),在坐标(x,y,z)处画一个点,多画一个点就多加个函数,自己加个点或改改坐标试试
//因为窗口大小为800x600,所以点的坐标范围为(-400,-300,z)到(400,300,z)
glVertex3f(0.0f,0.0f,0.0f);
// glVertex3f(25,5,0);
//把上面函数前面的//去掉看看加一个点是什么情况
//结束绘画
glEnd();
// 刷新绘图命令,强制完成所有绘画,这句话表示全部图形绘制完成
glFlush();
}
// 设置渲染状态(听起来满下人,实际上很简单)
void SetupRC(void)
{
//清除颜色(这里为黑色,为了方便找画的那个点),可以理解成背景颜色
//和glColor4f(1.0f, 0.0f, 0.0f,1.0f)一样,所有参数都在0.0到1.0之间,后缀f是表示参数是浮点型的
//最后的那个1.0f是透明度,0.0f表示全透明,1.0f是完全不透明
glClearColor(0.0f, 0.0f, 0.0f,1.0f);
}
// 当绘制的窗口大小改变时重新绘制,使绘制的图形同比例变化,
//几乎所有OpenGL程序中的这个函数都是一样的,所以,放心大胆的拷贝吧
void ChangeSize(int w, int h)
{
GLfloat aspectRatio;
// 防止被0除
if(h == 0)
h = 1;
// 设置观察视野为窗口大小(用FLASH里面的话来说应该叫设置摄象机视野)
glViewport(0, 0, w, h);
// 重置坐标系统
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
// 建立裁剪区域 (左, 右, 底, 顶, 近, 远)
aspectRatio = (GLfloat)w / (GLfloat)h;
if (w <= h)
glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else
glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
// 主函数
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
//设置显示模式
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
//设置窗口大小为800x600像素
glutInitWindowSize(800, 600);
//建立一个叫OpenGL的窗口
glutCreateWindow("OpenGL");
//调用函数RenderScene进行绘制
glutDisplayFunc(RenderScene);
//如果窗口大小改变则调用函数ChangeSize重新进行绘制
glutReshapeFunc(ChangeSize);
//清屏
SetupRC();
//循环绘制
glutMainLoop();
return 0;
}
画完了,还比较简单吧,画图的语言很简洁,就5句而已,
glColor3f(1.0f, 0.0f, 0.0f);
glPointSize(3);
glBegin(GL_POINTS);
glVertex3f(0.0f,0.0f,0.0f);
glEnd();
其余的全在为作图作准备。
是不是觉得OpenGL的函数名称很变态,又臭又长?
实际上,绝大部分OpenGL函数都遵循一种命名约定,它可以告诉你这个函数来自哪个库,并且还常常提示你这个函数将接受的参数个数和类型。所有函数都有个根名称,表示这个函数对应的OpenGL命令。例如:glColor3f 的根名称是Color,前缀gl表示gl库函数,后缀3f表示这个函数接受3个浮点型参数。所有的OpenGL函数都采用了下面的格式:
<函数库前缀><根命令><可选参数数量><可选参数类型>
现在你是不是又觉得OpenGL的函数很方便,很容易记忆了呢?
本文和程序属于原创,转载请标明作者和出处,欢迎用于教育用途,严禁用于商业用途
[此贴子已经被作者于2006-5-27 23:04:44编辑过]