Open Cascade中的Visual3d_Layer可以在场景的上层及底层单独绘制不同的物体,这些物体不响应主场景的任何变换。
Top Layer可以用来绘制一些3D的UI;Under Layer通常用来实现渐变的背景色。
Layer的主要绘制代码位于TKOpenGL模块中的OpenGl_togl_begin_layer_mode.c 文件中。
其场景设置及主要的绘制操作在函数 call_togl_redraw_layer2d 中。
首先调用
glMatrixMode( GL_MODELVIEW ); glPushMatrix (); glLoadIdentity (); glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity ();
设置新的单位视图模型矩阵和投影矩阵。之后调用
glOrtho设置了一个新的投影矩阵。
调用 glViewport 设置Layer对应的窗口位置和大小。
无论Layer中的投影矩阵和视图模型矩阵怎样设置,应该保证下面两点:
对于Top Layer应该保证图形不被主场景的图形覆盖;而Under Layer则应该保证其不会遮挡到主场景及Top Layer中的图形;
glPushAttrib (GL_LIGHTING_BIT | GL_LINE_BIT | GL_POLYGON_BIT | GL_DEPTH_BUFFER_BIT | GL_CURRENT_BIT); glDisable (GL_DEPTH_TEST); glCallList (ptrLayer->listIndex); glPopAttrib ();
上面的函数实现了这些要求。 每次绘制Layer时,保存上次的Depth_buffer,然后关闭深度测试,绘制图形,最后再恢复之前的Depth_buffer。
上面的实现也可以改成:
对于Under Layer
glCallList (ptrLayer->listIndex); glClear(GL_DEPTH_BUFFER_BIT);
对于Top Layer
glClear(GL_DEPTH_BUFFER_BIT); glCallList (ptrLayer->listIndex);
可以实现同样的效果,但需要判断Layer的类型。
最后要恢复投影矩阵,视图模型矩阵和视口的设置:
glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode( GL_MODELVIEW ); glPopMatrix (); gpViewport(主场景的视口设置); gLFlush(); // 绘制结束
在程序的绘制循环中,按照 Under Layer, 主场景, Top Layer的顺序依次绘制。
在Open CADCADE 的 V3D_View 类中,函数 SetAntialiasingOn 用来开启反走样。在GEFORCE 9系列的显卡上,该函数可以得到正确的显示效果。在GEFORCE 7 和 8系列的显卡上,调用该函数将得到错误的显示效果。在实体上出现三角化的网格。 原因没找到。? ? ?