• vtk中使用某个OpenGL扩展的问题


    因为要为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

  • 相关阅读:
    c++异常处理
    循环数比较
    交错01串
    六一儿童节
    独立的小易
    牛客网上的最后一位
    微微信.NET 为什么採用文件系统而不是数据库?
    Ugly Numbers(1.5.8)
    xcode6-beta下载
    接收socket数据的粘包处理
  • 原文地址:https://www.cnblogs.com/qwcbeyond/p/2640808.html
Copyright © 2020-2023  润新知