Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt5中的OpenGL与QOpenGL/QtOpenGL:差异和局限性?_Qt_Opengl_Qt5 - Fatal编程技术网

Qt5中的OpenGL与QOpenGL/QtOpenGL:差异和局限性?

Qt5中的OpenGL与QOpenGL/QtOpenGL:差异和局限性?,qt,opengl,qt5,Qt,Opengl,Qt5,由于有两种方法可以将OpenGL与(/wrapper和常规API)结合使用,我想知道每种方法的局限性是什么。有人能告诉我QOpenGL包装是否有我应该注意的限制吗 我问这个问题的原因是因为我不想开始使用QOPENGLWrapper并发现我不能使用OpenGLAPI的全部功能。是否有人对这两方面都有经验,并能在功能、性能和易用性方面提供一些提示 我不想开始使用QOPENGLWrapper,然后发现我不能使用OpenGLAPI的全部功能 好的,Qt5.0的OpenGL包装器是建立在OpenGL ES

由于有两种方法可以将OpenGL与(/wrapper和常规API)结合使用,我想知道每种方法的局限性是什么。有人能告诉我QOpenGL包装是否有我应该注意的限制吗

我问这个问题的原因是因为我不想开始使用QOPENGLWrapper并发现我不能使用OpenGLAPI的全部功能。是否有人对这两方面都有经验,并能在功能、性能和易用性方面提供一些提示

我不想开始使用QOPENGLWrapper,然后发现我不能使用OpenGLAPI的全部功能

好的,Qt5.0的OpenGL包装器是建立在OpenGL ES(嵌入式系统)2.0规范之上的,该规范本质上是桌面OpenGL 3.0规范的简化版本。Qt选择此规范是为了便于移植,因为它除了在几乎所有现代PC上都受支持外,还受到移动平台的广泛支持。如果您选择使用Qt包装器,您必须克服OpenGL ES 2.0规范的缺点,该规范在很大程度上分为以下几类:

  • 没有固定的功能管道功能。(无转换堆栈、
    glBegin
    glEnd
    glLightf
    等)
  • 不支持高级OpenGL 3+功能或仅支持扩展。(纹理缓冲区对象、计算着色器、原子加载存储纹理、细分着色器、均匀缓冲区对象等)
  • 缺少某些纹理格式(整数纹理、图像纹理等)
  • GLSL语法和语义上的细微差异。(缺少布局限定符、通过
    highp
    lowp
    声明的数据精度要求等)
  • 缺乏一些方便的方法。(
    glBlitFramebuffer
    glMultiDrawArrays
    glDrawRangeElements
    等)
  • 有关OpenGL ES 2.0规范的完整描述,请参见

    然而,这种特性的缺乏并不意味着Qt包装器不能完成您需要的功能。尽管OpenGLES2.0缺少很多有用的功能,但您仍然可以完成整个桌面OpenGL规范所允许的99%。如果您决定通过自定义包装器使用桌面OpenGL规范,Qt仍然可以通过使用
    QGLFormat
    类来管理桌面OpenGL上下文的创建和窗口化

    请记住,如果您决定使用桌面OpenGL包装,并在Qt应用程序中使用这些包装,Qt提供的某些类可能会干扰自定义包装的操作。例如,QGLWidget上的QPaint操作可能利用OpenGL ES规范的功能,并可能干扰包装器对象的操作

    就个人而言,我更喜欢使用自定义OpenGL包装器,因为我更喜欢桌面OpenGL规范,因为功能集定义得更好,并且它们提供了更多选项来解决问题。另一方面,Qt5提供了一些绝对奇妙的体系结构,用于使用OpenGL ES创建快速、强大的动态用户界面。(通过QtQuick 2和QML)


    哪种API最适合您的需求基本上取决于您是否针对嵌入式或移动平台(在这种情况下,您被迫使用OpenGL ES),以及您是否愿意牺牲额外的开发时间来编写和维护自定义OpenGL 3+包装

    如果我同时使用OpenGL4.1,答案是否相同?我相信您可以通过设置上下文版本(即QGLFormat::setVersion(4,1))并调用OpenGL 4.1类来使用具有4.1功能的QOpenGL包装器。您可以使用Qt创建OpenGL 4.1上下文,但您会发现一些Qt包装器是为OpenGL ES规范设计的,不支持某些功能。例如,
    QOpenGLFramebufferObject
    类不支持多目标渲染。速度有差异吗?如果使用opengl api,函数会比使用Qopengl更快吗?还是相同?这取决于您将使用的opengl标准的版本。如果您使用的是桌面OpenGL 3+,那么在渲染复杂场景时,您肯定会看到使用QOpenGL的性能有所提高。渲染简单场景时,与使用OpenGL 3+和OpenGL ES 2.0相比,性能上的差异可以忽略不计。这个问题与任何试图使用Qt和OpenGL的人都非常相关。因此,是的,这是建设性的。