opengl杂七杂八

在用opengl宝典学习第二个例子,即画一个矩形的时候我想偷懒一下,于是根本就没写ChangeSize函数,也没有用glutReshapeFunc()调用,而是直接进行glRectf()调用,但是无论如何也并不显示出矩形来。于是我有按照书上的敲了一编,这次就出现了。很迷茫。不是只要窗口不改变大小就不用调用glutReshapeFunc()吗,那么有没有应该没有关系啊,即使是在glutReshapeFunc()中进行了坐标系统的设置,那么在刚出现窗口的时候,也应该没有用啊。带着疑问翻书,原来:“即使你所编写的程序始终以全屏模式运行,这个窗口仍然存在改变大小的时刻,也就是当它被创建时。”

而对于这段代码:

当我把glViewport()之后的内容都注释掉后,仍然是一个充满整个空间的红矩形。在第一个glLoadIdentity()之后仍然如此。当我改成这样后:  

只有当第一次出现时有矩形,改变大小后就没有了。其实仅有一个函数是真正起作用的,即glOrtho()只要将这个函数放在RenderScence()画图形之前就行了。但是仍然不会在改变大小后出现。而如果在glOrtho()之前,放上  glMatrixMode(GL_PROJECTION); glLoadIdentity();就可以了。哦,其实只要glLoadIdentity()就可以了,这是我在写到后一段时感悟的。书上是这样说的:

投影矩阵就是实际定义可视区域的地方。你需要调用一次glLoadIdentity()函数,因为glOrtho函数实际上并不建立裁剪区域,而是修改原有的裁剪区域。他把描述当前裁剪区域的矩阵与参数所提供的裁剪区域矩阵想成。现在,你只需要知道调用glLoadIdentity()函数的目的是在执行任何矩阵乘法操作之前对当前的坐标系统“重置”,在glOtho()被调用之后,每个后续的glOrtho()调用将会导致目标裁剪区域被破坏,甚至导致矩形无法显示!!!

第三个例子:

如果将glutPostRedisplay();注释掉,那么矩形就不动了,只有在窗口最小化或。。后出发了RenderScence()才会看到瞬移了的矩形。其实用单缓存还是双缓存影响的效果并不大,没有发现明显的闪烁。还有在单缓存下使用glSwapBuffers()是没有反应的,整个窗口显示为白白的,根本就没有flush。而书上说的仍然执行刷新任务并不正确啊!

 

下一节OpenGL状态机,没有看懂!!!

 

总结一下,可以用glFinish()和glFlush()来牵制执行所有尚未执行的渲染命令,但是glFinish()是会阻塞的,而glFlush()并不阻塞,是一种异步的渲染模式。

glut的有用函数:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值