canvas教程

opengl非全屏绘图的简单使用总结

字号+ 作者:H5之家 来源:H5之家 2018-01-25 08:02 我要评论( )

OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。

  OpenGL是个专业的3D程序接口,是一个功能强大,调用方便的底层3D图形库。OpenGL的前身是SGI公司为其图形工作站开发的IRIS GL。

     初始化;

 

以下是引用片段:
 BOOL bSetupPixelFormat(HDC hdc)
  {
  PIXELFORMATDESCRIPTOR *ppfd; // pfd,
  int pixelformat;
  static PIXELFORMATDESCRIPTOR pfd =
  {
  sizeof(PIXELFORMATDESCRIPTOR), //固定值
  1, //固定值
  PFD_DRAW_TO_WINDOW | // support window
  PFD_SUPPORT_OPENGL | // support OpenGL
  PFD_DOUBLEBUFFER,
  16, //程序在16位色彩下运行
  0, 0, 0, 0, 0, 0, // color bits ignored
  0, // no alpha buffer
  0, // shift bit ignored
  0, // no accumulation buffer
  0, 0, 0, 0, // accum bits ignored
  32, // 32-bit z-buffer
  0, // no stencil buffer
  0, // no auxiliary buffer
  PFD_MAIN_PLANE, // main layer
  0, // reserved
  0, 0, 0 // layer masks ignored
  };
  ppfd = &pfd;
  if ( (pixelformat = ChoosePixelFormat(hdc, ppfd)) == 0 ) //选择象素格式
  {
  MessageBox(NULL, "ChoosePixelFormat failed", "Error", MB_OK);
  return FALSE;
  }
  if (SetPixelFormat(hdc, pixelformat, ppfd) == FALSE) //设置格式
  {
  MessageBox(NULL, "SetPixelFormat failed", "Error", MB_OK);
  return FALSE;
  }
  return TRUE;
  }
  GLvoid TOpenGL_Form::initializeGL(GLsizei width, GLsizei height)
  {
  glClearIndex( (GLfloat)BLACK_INDEX); //
  glClearColor(1.0,1.0,1.0,0);
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); //清空Buffer
  glClearDepth( 1.0 ); //清空Buffer

  /*OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单个//函数命令执行操作,传入所有要清除的缓存表,若硬件能同时清除,则这些清除操作可以同时进行;否则,//各个操作依次进行。

  //void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);RGBA方式下的颜色//缓存

  //void glClearIndex(GLfloat index);颜色表方式下的颜色缓存

  //void glClearDepth(GLclampd depth); 颜色表方式下的深度缓存

  //void glClearStencil(GLint s); 颜色表方式下的模板缓存

  //void glClearAccum(GLflaot red,GLfloat green,GLfloat blue,GLfloat alpha); 颜色表方式下的累积缓//存

  //void glClaear(Glbitfield mask);清除指定的缓存。参数mask可以是下面这些位逻辑的或

  // GL_COLOR_BUFFER_BIT

  // GL_DEPTH_BUFFER_BIT

  // GL_STENCIL_BUFFER_BIT

  // GL_ACCUM_BUFFER_BIT

  */

  glEnable(GL_DEPTH_TEST); //使用 depth buffer

  glMatrixMode( GL_PROJECTION ); //设置物体对象

  /*-------------------------------------------------------------------------------------------------------------------------------

  两个基本OpenGL矩阵操作函数:void glLoadMatrix{fd}(const TYPE *m)

  设置当前矩阵中的元素值。函数参数*m是一个指向16个元素(m0,m1,...,m15)的指针,

  这16个元素就是当前矩阵 M 中的元素,其排 列方式如下:

  * *

  * m0 m4 m8 m12 *

  M =* m1 m5 m9 m13 *

  * m2 m6 m10 m14 *

  * m3 m7 m11 M15 *

  * *

  void glMultMatrix{fd}(const TYPE *m) 用当前矩阵去乘*m所指定的矩阵,并将结果存放于*m中。当前矩阵可以是用glLoadMatrix()指定的矩阵,也可以是其它矩阵变换函数的综合结果。

  *************************几何变换**************************************************************

  平移变换函数如下:void glTranslate{fd}(TYPE x,TYPE y,TYPE z)

  旋转变换函数如下:void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z)

  缩放和反射变换函数如下:void glScale{fd}(TYPE x,TYPE y,TYPE z)

  *************************投影变换**************************************************************

  在进行投影变化前,必须加上下面两个函数glMAtrixMode(GL_PROJECTION);glLoadIdentity();

  正射投影函数共有两个,一个函数是:void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);另一个函数是:void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)

  透视投影函数共有两个,一个函数是:void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far);另一个函数是:void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear,GLdouble zFar);

  *************************裁切变换**************************************************************

  在OpenGL中,空间物体的三维裁剪变换包括两个部分:视景体裁剪和附加平面裁剪。视景体裁剪已经包含在投影变换里;附加平面裁剪函数为:void glClipPlane(GLenum plane,Const GLdouble *equation);在调用附加裁剪函数之前,必须先启动glEnable(GL_CLIP_PLANEi),使得当前所定义的裁剪平面有效;当不再调用某个附加裁剪平面时,可用glDisable(GL_CLIP_PLANEi)关闭相应的附加裁剪功能。

  *************************视角变换**************************************************************

  OpenGL中相关函数是:glViewport(GLint x,GLint y,GLsizei width, GLsizei height);

  *************************矩阵堆栈的操作********************************************************

  堆栈操作函数有以下两个:void glPushMatrix(void);void glPopMatrix(void);

  -------------------------------------------------------------------------------------------------------------------------------------------*/

  

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 教教我!用C画图,给分!!!!!

    教教我!用C画图,给分!!!!!

    2017-10-28 08:43

  • 中国领先的IT技术网站

    中国领先的IT技术网站

    2017-10-10 10:05

  • Canvas内容重画问题,在线等!!!

    Canvas内容重画问题,在线等!!!

    2017-10-08 13:01

  • 请教一个屏幕画图问题,呼唤高手!

    请教一个屏幕画图问题,呼唤高手!

    2017-09-14 16:02

网友点评
d