因为要为vtk写一个新的renderer,使用opengl4.0的新特性来实现OIT (Order independent transparent)

在vtk中使用新的opengl扩展是通过 vtkOpenGLExtensionManager来查询是否支持某个扩展,以及载入扩展的。

它是通过解析Utilities\ParseOGLExt\headers  gl3.h  glext.h glxext.h wglext.h 里面的函数,获得函数的入口地址来调用opengl的。它在vtk编译时会生成两个文件:vtkgl.h 和vtkgl.cxx 以后vtk用到的opengl函数都从这两个文件中获取。

vtk5.10中还是支持最高opengl4.1的扩展  因此要使用更高版本的opengl功能,之前我试过拿4.2的文件直接覆盖这几个文件,发现vtk会编译不成功,看来还是要等待vtk官方升级了。

在使用opengl扩展中,经常会出现函数地址是0x0000000的错误,这是没有成功获取入口地址的表现。而且某些函数,如glGenBuffers是在opengl2.0中支持的,因此使用opengl4.0的环境下,也要载入opengl2.0的扩展,不然这些函数会找不到入口地址而导致程序崩溃。

在使用opengl扩展中,使用一个扩展出了问题,就是GL_EXT_direct_state_access,使用vtkOpenGLExtensionManager的loadextention方法总是载入失败,单步跟踪调试之后发现是一系列的opengl函数都没有成功获取到函数的入口地址,如glprogramuniform1dEXT这种double型的。后来拿了最新的glew1.9已经支持了opengl4.3以及更新了4.3的显卡驱动,发现这种函数还是属于missing的状态,我怀疑是nvidia显卡的问题了,AMD的好像有支持的。

最终的解决的方法是vtkOpenGLExtensionManager的另一个“掩耳盗铃”的方法,LoadSupportExtention,这种方法失败的时候不会导致程序崩溃,然后把能获取的函数入口都载入,不能找到的就不管了。

这是我在vtk论坛上的自问自答。http://vtk.1045678.n5.nabble.com/OpenGL-extension-quot-NV-shader-buffer-store-quot-can-not-be-supported-td5715229.html

posted on 2012-08-15 21:20  30斤大番薯  阅读(3149)  评论(2编辑  收藏  举报