/************************http://blog.csdn.net/sunboyiris*************************************/    //根据OpenGL或GLU错误代码产生错误字符串  const GLubyte* APIENTRY gluErrorString (     GLenum   errCode);  const wchar_t* APIENTRY gluErrorUnicodeStringEXT (     GLenum   errCode);  //得到一个描述GLU版本号或支持GLU扩展调用的字符串  const GLubyte* APIENTRY gluGetString (     GLenum   name);  /* near和far默认为-1和1,此函数决定一个平行六面体 */ void APIENTRY gluOrtho2D (     GLdouble left,      GLdouble right,      GLdouble bottom,      GLdouble top);  /*  gluPerspective这个函数指定了观察的视景体(frustum为锥台的意思,通常译为视景体)在世界坐标系中的具体大小 */ void APIENTRY gluPerspective (     GLdouble fovy,      GLdouble aspect,      GLdouble zNear,      GLdouble zFar);  /*将裁剪区域变成一个单位立方体.  它是用来根据当前鼠标选择区域生成一个相应的投影矩阵的。这里面头两个参数不是这个选择区域的左上角位置,而是整个区域的中心位置。如果错把它当成左上角,选择的区域就会斜向上有个偏移。 */ void APIENTRY gluPickMatrix (     GLdouble x,      GLdouble y,      GLdouble width,      GLdouble height,      GLint    viewport[4]);  /* 该函数定义一个视图矩阵,并与当前矩阵相乘。 第一组eyex, eyey,eyez 相机在世界坐标的位置 第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置 第三组upx,upy,upz 相机向上的方向在世界坐标中的方向 你把相机想象成为你自己的脑袋: 第一组数据就是脑袋的位置 第二组数据就是眼睛看的物体的位置 第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)  */ void APIENTRY gluLookAt (     GLdouble eyex,      GLdouble eyey,      GLdouble eyez,      GLdouble centerx,      GLdouble centery,      GLdouble centerz,      GLdouble upx,      GLdouble upy,      GLdouble upz);   /*  用于返回变换后的窗口坐标 基本思路 1、将输入的顶点,通过模型视图矩阵,变换到模型视图矩阵的坐标系中;  2、将模型视图矩阵中的顶点,再变换到投影矩阵中;  3、将顶点缩放到[0, 1]的映射区间中;  4、通过视口的位置和大小,计算出当前3D顶点中的屏幕坐标(2D坐标) */ int APIENTRY gluProject (     GLdouble        objx,      GLdouble        objy,      GLdouble        objz,       const GLdouble  modelMatrix[16],      const GLdouble  projMatrix[16],      const GLint     viewport[4],      GLdouble        *winx,      GLdouble        *winy,      GLdouble        *winz);   /*  gluPorject反过来的过程 思路: 1、首先,需要将输入的顶点,通过视口变换到[0, 1]之间; 2、然后将顶点缩放到[-1, 1]之间,就是上面代码中的scaleMat矩阵的逆矩阵 3、然后乘上投影矩阵的逆矩阵; 4、最后就是乘上模型视图矩阵的逆矩阵;  */ int APIENTRY gluUnProject (     GLdouble       winx,      GLdouble       winy,      GLdouble       winz,      const GLdouble modelMatrix[16],      const GLdouble projMatrix[16],      const GLint    viewport[4],      GLdouble       *objx,      GLdouble       *objy,      GLdouble       *objz);   //gluScaleImage这个函数用适当的像素存储模式改变一个像素图像的大小来读取源图像的像素数据然后把像素写入新的目标图像 int APIENTRY gluScaleImage (     GLenum      format,      GLint       widthin,      GLint       heightin,      GLenum      typein,      const void  *datain,      GLint       widthout,      GLint       heightout,      GLenum      typeout,      void        *dataout);  /* 如果已经创建0级(分辨率最高的)mipmap, 可以使用函数gluBuild1DMipmaps(), gluBuild2DMipmaps() 和 gluBuild3DMipmaps()来定义和创建mipmap金字塔.  塔顶为1X1(对于一维纹理为1; 三维纹理为1X1X1)的mipmap. 如初始图像的大小不是2的幂, 可以使用函数gluBuild*DMipmaps()将图像大小缩放到最接近2的幂, 如纹理太大, 可以使用函数gluBuild*DMipmaps()将图像缩小到足够的资源来存储它(使用GL_PROXY_TEXTURE机制确定). */ int APIENTRY gluBuild1DMipmaps (     GLenum      target,      GLint       components,      GLint       width,      GLenum      format,      GLenum      type,      const void  *data);  int APIENTRY gluBuild2DMipmaps (     GLenum      target,      GLint       components,      GLint       width,      GLint       height,      GLenum      format,      GLenum      type,      const void  *data);