- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
还可通过glBegin再产生新的图形。glBegin(GLenum mode)参数有: GL_POINTS,GL_LINES,GL_LINE_STRIP,GL_LINE_LOOP, GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN,GL_QUADS, GL_QUAD_STRIP, GL_POLYGON 在glBegin和glEnd之间的有效函数有: glVertex,glColor,glIndex, glNormal,glTexCoord, glEvalCoord,glEvalPoint, glMaterial, glEdgeFlag 四.小结 1、如果要响应WM_SIZE消息,则一定要设置视口和矩阵模式。 2、尽量把你全部的画图工作在响应WM_PAINT消息时完成。 3、产生一个绘制环境要耗费大量的CPU时间,所以最好在程序中只产生一次,直到程序结束。 4、尽量把你的画图命令封装在文档类中,这样你就可以在不同的视类中使用相同的文档,节省你编程的工作量。 5、glBegin和glEnd一定要成对出现,这之间是对图元的绘制语句。 glPushMatrix()和glPopMatrix()也一定要成对出现。glPushMatrix()把当前的矩阵拷贝到栈中。当我们调用 glPopMatrix时,最后压入栈的矩阵恢复为当前矩阵。使用glPushMatrix()可以精确地把当前矩阵保存下来,并用 glPopMatrix把它恢复出来。这样我们就可以使用这个技术相对某个物体放置其他物体。例如下列语句只使用一个矩阵,就能产生两个矩形,并将它们成一定角度摆放。 四.小结 glPushMatrix();? ?glTranslated(?m_transX,?m_transY,?0);? ?glRotated(?m_angle1,?0,?0,?1);? ?glPushMatrix();? ?glTranslated(?90,?0,?0);? ?glRotated(?m_angle2,?0,?0,?1);? ?glColor4f(0.0f,?1.0f,?0.0f,?1.0f);? ?glCallList(ArmPart);//ArmPart?且桓鼍卣竺? ?glPopMatrix();? ?glColor4f(1.0f,?0.0f,?0.0f,?1.0f);? ?glCallList(ArmPart);? glPopMatrix();? 四.小结 6、 解决屏幕的闪烁问题。我们知道,在窗口中拖动一个图形的时候,由于边画边显示,会出现闪烁的现象。在GDI中解决这个问题较为复杂,通过在内存中生成一个 内存DC,绘画时让画笔在内存DC中画,画完后一次用Bitblt将内存DC“贴”到显示器上,就可解决闪烁的问题。在OpenGL中,我们是通过双缓存 来解决这个问题的。一般来说,双缓存在图形工作软件中是很普遍的。双缓存是两个缓存,一个前台缓存、一个后台缓存。绘图先在后台缓存中画,画完后,交换到 前台缓存,这样就不会有闪烁现象了。通过以下步骤可以很容易地解决这个问题: 1) 要注意,GDI命令是没有设计双缓存的。我们首先把使用InvalidateRect(null)的地方改成InvalidateRect(NULL,FALSE)。这样做是使GDI的重画命令失效,由OpenGL的命令进行重画; 2) 将像素格式定义成支持双缓存的(注:PFD_DOUBLEBUFFER和PFD_SUPPORT_GDI只能取一个,两者相互冲突)。 四.小结 ?pixelDesc.dwFlags?=? ?PFD_DRAW_TO_WINDOW?|? ?PFD_SUPPORT_OPENGL?|? ?PFD_DOUBLEBUFFER?|? ?PFD_STEREO_DONTCARE;? 3) 我们得告诉OpenGL在后台缓存中画图,在视类的OnSize()的最后一行加入:glDrawBuffer (GL_BACK); 4) 最后我们得把后台缓存的内容换到前台缓存中,在视类的OnPaint()的最后一行加入:SwapBuffers(dc.m_ ps.hdc)。 7、生成简单的三维图形。我们知道,三维和二维的坐标系统不同,三维的图形比二维的图形多一个z坐标。我们在生成简单的二维图形时,用的是 gluOrtho2D;我们在生成三维图形时,需要两个远近裁剪平面,以生成透视效果。实际上,二维图形只是视线的近裁剪平面z= -1,远裁剪平面z=1;这样z坐标始终当作0,两者没有本质的差别。 四.小结 在上述基础之
文档评论(0)