opengl编程指南第一例

来源:互联网 发布:数据算法 编辑:程序博客网 时间:2024/06/09 14:23

 转载出处 http://blog.sina.com.cn/s/blog_4d914c060100pjou.html
原书例子代码:
#include <whateverYouNeed.h>
main() {
   InitializeAWindowPlease();
   glClearColor (0.0, 0.0, 0.0, 0.0);
   glClear (GL_COLOR_BUFFER_BIT);
   glColor3f (1.0, 1.0, 1.0);
   glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
   glBegin(GL_POLYGON);
      glVertex3f (0.25, 0.25, 0.0);
      glVertex3f (0.75, 0.25, 0.0);
      glVertex3f (0.75, 0.75, 0.0);
      glVertex3f (0.25, 0.75, 0.0);
   glEnd();
   glFlush();
   UpdateTheWindowAndCheckForEvents();
}
说明:如果把这段代码原原本本复制粘贴到VC中运行,是显示不出结果的。因为:whateverYouNeed.h, InitializeAWindowPlease();,UpdateTheWindowAndCheckForEvents();,并不是某个具体的头文件或函数,它们是根据相应的编译环境不同而让读者自己在这个位置加上合适的代码。相当于它们都是个占位符,要让别的函数代替它们。
 
改动的程序(实现相同的功能):
#include <stdlib.h>
#include <GL/glut.h>
#pragma comment(lib,"OpenGL32.lib")//添加库文件
#pragma comment(lib,"Glu32.lib")
#pragma comment(lib,"Glaux.lib")
void myDisplay(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glClear (GL_COLOR_BUFFER_BIT);
glColor3f (1.0, 1.0, 1.0);
glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f (0.25, 0.25, 0.0);
glVertex3f (0.75, 0.25, 0.0);
glVertex3f (0.75, 0.75, 0.0);
glVertex3f (0.25, 0.75, 0.0);
glEnd();
   
   glFlush();
}
void myReshape(GLsizei w,GLsizei h)
{
glViewport(0,0,w,h);//设置视口


glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION
glLoadIdentity();//将当前矩阵置换为单位阵


if(w <= h)
   gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵
else
   gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW
}
int main(int argc,char ** argv)
{


    glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(200,200);


   
glutCreateWindow("Triangle");




glutReshapeFunc(myReshape);
glutDisplayFunc(myDisplay);


glutMainLoop();
return(0);
}
myDisplay画了正方形。


  ·glClear 将buffers设置为预先设定的值。参数GL_COLOR_BUFFER_BIT表明现在可以向buffer中写入颜色值。


  ·glBegin和glEnd是一一对应的。这两个函数限制了一组或多组图元的顶点定义。在这两个函数中间就是你所绘制的由多个顶点组成的图元。函数的参数表明了所绘制的图元的类型。本例中的GL_TRIANGLES 表明所绘制的图形为三角形。 


  ·glShadeModel选择平坦或光滑渐变模式。GL_SMOOTH为缺省值,为光滑渐变模式,GL_FLAT为平坦渐变模式。


  ·glColor设置当前颜色。后面跟的数字为参数个数。3表明有三个参数,分别为红、绿、蓝,4则多一个参数alpha。紧跟数字后面的字母表示数据类型。本例中的glColor3f表示三个参数,数据类型为GLfloat。


  ·glVertex指定顶点。同样函数明中的数字表明参数个数。参数分别为x,y或x、y、z。紧跟数字后面的字母表示数据类型。本例中glVertex2f表明两个参数,数据类型为GLfloat。窗口的中心为原心,坐标为(0,0,0)。横坐标向左为负,向右为正;纵坐标向上为正,向下为负;z坐标向屏幕里为负,屏幕外为正,坐标系符合右手定则。


  现在你将main函数中的glutReshapeFunc(myReshape); 注释掉,任意改变三角形顶点的坐标你会发现窗口的最左边,最右边的x值分别为-1和1,而窗口的最上端,最下端的y值分别为1和-1。由此可见glVertex中坐标的值实际上是和窗口的大小成倍数的关系。好了,现在恢复原来的程序。


  ·glFlush迫使OpenGL函数在有限时间里运行。glFlush清空所有buffer,使所有发出的命令能在规定的时间内运行。一定不能忘记这一条语句。只有加了这一句,前面的命令才能执行。


  myReshape 改变窗口的大小。


  ·glViewport(Glint x,Glint y,GLsizei width,GLsizei height)设置视口。视口是一个矩形,x,y为视口左下角的坐标,以像素为单位,缺省值为(0,0)。width和height分别为视口的宽和高。OpenGl context第一次贴到窗口上时width和height分别设置成窗口的大小。


  ·glMatrixMode 指明哪一个矩阵为当前矩阵。本例中GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目标。GL_MODELVIEW指明模型视景矩阵。


  ·glLoadIdentity将当前矩阵置换为单位阵。


  ·gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)定义二维正视投影矩阵。left,right分别设置左右垂直切平面的坐标,bottom,top分别设置上下垂直切平面的坐标。
0 0