Python OpenGL,PyQt和Legacy OpenGL的兼容性是怎么回事?

时间:2015-08-25 19:23:00

标签: python qt opengl

我试图了解Python OpenGL正在做什么和Qt使用。实际问题采用粗体。如果对于正确的SO格式有太多问题,请提前道歉,但它们都是相关的,我猜测知道答案的人可能知道答案。

我在PyQt4上使用Python 2.7,在Win7 x64上使用Python OpenGL模块。 GL.glGetString('GL.GL_VERSION')返回'3.3.0 - Build 8.15.10.2725'

所以这告诉我我正在使用现代版的OpenGL,根据我的理解,我不再使用固定管道,用户需要提供着色器。

  1. Python模块提供的OpenGL版本是否被视为合理的现代版本?

  2. PyQt4.QtOpenGL是否提供自己的实现,还是依赖于Python OpenGL模块?

  3. 如何检查PyQt4.QtOpenGL提供的OpenGL版本,如果它实际上是一个单独的安装?

  4. 但是,如果我不使用GL.glUseProgram(...)功能,我仍然可以在屏幕上呈现一些基本着色以响应光线的东西。所以这意味着有一些默认着色器。我不确定这是否是OpenGL的一部分,或者只是Python模块中包含的内容。

    1. 是否在Python OpenGL模块中提供了默认的顶点和片段着色器,如果我不调用glUseProgram(...),则使用它,或者这是兼容模式提供的固定管道着色器?
    2. 另一方面,我可以安装自己的着色器,因此这与更高版本的OpenGL一致。

      此外,Python Qt4 OpenGL示例广泛使用glBegin()glEnd()glVertex,旋转矩阵等,告诉我这是使用传统的OpenGL。

      1. 这是否意味着Python OpenGL模块启用GL_ARB_compatibility?或者这可能来自PyQt4.QtOpenGL子模块?
      2. 另外,在C ++中查看Qt5.5 OpenGL示例时,没有调用glBegin(),并且示例中包含一些着色器。我猜这是纯粹的现代OpenGL,没有传统的东西。

        1. 如何查看Qt5.5(C ++)使用的OpenGL版本?
        2. 对于OpenGL的所有Qt支持我也有点不知所措,我希望能够关注网络上的非Qt示例,并尝试使用OpenGL提供的结构如果可能的话,而不是QT课程。

          例如(从HeNe网站http://nehe.gamedev.net/tutorial/blending/16001/复制):

          #include <gl\gl.h>              // Header File For The OpenGL32 Library
          #include <gl\glu.h>             // Header File For The GLu32 Library
          #include <gl\glaux.h>           // Header File For The GLaux Library
          ...
          GLfloat xrot;                       // X Rotation
          GLfloat yrot;                       // Y Rotation
          GLfloat xspeed;                     // X Rotation Speed
          GLfloat yspeed;                     // Y Rotation Speed
          GLfloat z=-5.0f;                    // Depth Into The Screen
          GLfloat LightAmbient[]=  { 0.5f, 0.5f, 0.5f, 1.0f };    // Ambient Light Values
          GLfloat LightDiffuse[]=  { 1.0f, 1.0f, 1.0f, 1.0f };    // Diffuse Light Values
          GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };    // Light Position
          GLuint  filter;                     // Which Filter To Use
          GLuint  texture[3];                 // Storage for 3 textures
          
          1. 我如何使用现代&#34;纯&#34; Qt中的OpenGL,并没有过多依赖那些似乎没有添加Qt特定功能的Qt类,例如QMatrix4x4等?
          2. 非常感谢

1 个答案:

答案 0 :(得分:2)

TL; DR:使用Qt使用原始OpenGL所需的一切都记录在案here。您将以相同的方式访问任何其他函数集,但您不会使用QOpenGLFunctions,因为它们适用于OpenGL ES 2.0,但其他一些类派生自QAbstractOpenGLFunctions

您可以选择阅读并考虑使用更高级别的界面。如果您想使用它们,它们就在那里,但是再次 - 无论您是否愿意,它都是您的选择。只要平台的实现支持您需要的功能(即提供您请求的接口版本),Qt就可以方便地为您提供完整的,功能分辨的OpenGL API。

  1. 是。但它不是Python模块提供的版本,它是底层平台提供的版本。当平台不支持特定功能时,您将获得异常。 Python只是为你做了函数地址解析,它本身并没有实现任何OpenGL - 它只提供了一个很好的方式来使用你的平台从Python提供的东西(对比C)。

  2. 它直接使用底层的OpenGL实现 - 调用Python没有任何意义,因为Python的OpenGL模块除了在C和Python之间进行转换之外什么都不做。

  3. 这不是一个单独的安装。 Python和Qt都使用相同的平台实现,并将调用相同的库。

    1. 您的代码必须以您在QOpenGLContext上设置的格式请求特定版本,然后在create()成功后,您可以检查是否有该版本或更低版本。在所有情况下,都是提供版本的上下文format

      这些功能本身可以通过QAbstractOpenGLFunctions界面获得,这是原始的。

    2. Qt提供了有用的便利类,可以在C数据结构之上添加可用的接口 - 没有任何不纯的东西,你也不会被迫使用它们。实际上,它们不是通过基本的OpenGL接口提供的。获得上下文后,可以通过versionFunctions使用其功能。为了方便起见,一旦您将上下文设置为当前,就私下继承QOpenGLFunctions_maj_min,然后initializeOpenGLFunctions()。有关使用示例,请参阅QOpenGLFunctions的文档。