OCC 中Visual3d_Layer的实现

       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系列的显卡上,调用该函数将得到错误的显示效果。在实体上出现三角化的网格。 原因没找到。? ? ?

你可能感兴趣的:(测试,buffer,图形,layer,网格)