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
Python OpenGL、PyQt和传统OpenGL的兼容性如何?_Python_Qt_Opengl - Fatal编程技术网

Python OpenGL、PyQt和传统OpenGL的兼容性如何?

Python OpenGL、PyQt和传统OpenGL的兼容性如何?,python,qt,opengl,Python,Qt,Opengl,我正试图弄清楚Python OpenGL在做什么以及Qt的使用情况。实际问题以粗体显示。如果有太多问题需要适当的SO格式,请提前道歉,但它们都是相关的,我猜知道一个问题答案的人可能知道所有问题的答案 我在PyQt4上使用Python2.7,在Win7 x64上使用PythonOpenGL模块。 GL.glGetString(“GL.GL\u版本”)返回'3.3.0-Build 8.15.10.2725' 这说明我正在使用OpenGL的现代版本,据我所知,它不再使用固定管道,用户需要提供着色器 P

我正试图弄清楚Python OpenGL在做什么以及Qt的使用情况。实际问题以粗体显示。如果有太多问题需要适当的SO格式,请提前道歉,但它们都是相关的,我猜知道一个问题答案的人可能知道所有问题的答案

我在PyQt4上使用Python2.7,在Win7 x64上使用PythonOpenGL模块。
GL.glGetString(“GL.GL\u版本”)
返回
'3.3.0-Build 8.15.10.2725'

这说明我正在使用OpenGL的现代版本,据我所知,它不再使用固定管道,用户需要提供着色器

  • Python模块提供的OpenGL版本被认为是合理的现代版本吗?

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

  • 如果PyQt4.QtOpenGL提供的OpenGL版本是单独安装的,我如何检查该版本?

  • 但是,如果我不使用函数
    GL.glUseProgram(…)
    ,我仍然可以在屏幕上渲染一些东西,并使用基本的着色来响应照明。因此,这意味着存在一些默认着色器。我不确定这是OpenGL的一部分,还是Python模块中包含的东西

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

    另外,Python Qt4 OpenGL示例广泛使用了
    glBegin()
    glEnd()
    ,以及
    glVertex
    、旋转矩阵等,告诉我这是在使用传统OpenGL

  • 这是否意味着Python OpenGL模块启用了
    GL\u ARB\u兼容性
    ?或者这可能来自PyQt4.QtOpenGL子模块吗?
  • 也可以看到,C++中的Qt5.5 OpenGL示例没有调用<代码> GLUX()/Cux>,并且在示例中包含了一些着色器。我猜这是纯现代的OpenGL,没有遗留的东西

  • 如何检查Qt5.5(C++)使用的OpenGL版本?
  • 对于OpenGL的所有Qt支持,我也有点不知所措,我希望能够跟随web上的非Qt示例,并尽可能使用OpenGL提供的结构,而不是Qt类

    例如(复制自HeNe网站):

    #包含//OpenGL32库的头文件
    #包含//GLu32库的头文件
    #包含//GLaux库的头文件
    ...
    glxrot;//X旋转
    glyrot;//Y旋转
    GLfloat xspeed;//X转速
    glyspeed;//Y轴转速
    GLfloat z=-5.0f;//进入屏幕的深度
    GLfloat LightAmbient[]={0.5f,0.5f,0.5f,1.0f};//环境光值
    GLfloat LightDiffuse[]={1.0f,1.0f,1.0f,1.0f};//漫反射光值
    GLfloat LightPosition[]={0.0f,0.0f,2.0f,1.0f};//灯位
    GLuint过滤器;//使用哪个过滤器
    胶合纹理[3];//存储3种纹理
    
  • 我如何在Qt中使用现代的“纯”OpenGL,而不严重依赖似乎没有添加太多Qt特定功能的Qt类,例如
    QMatrix4x4
    等?

  • 非常感谢

    TL;DR:您需要使用原始OpenGL和Qt的所有内容都有文档记录。您将以相同的方式访问任何其他函数集,只不过您不会使用
    QOpenGLFunctions
    ,因为这些函数用于OpenGL ES 2.0,而是使用从
    QAbstractOpenGLFunctions
    派生的其他类

    您可以选择阅读并考虑使用更高级别的接口。如果你想使用它们,它们就在那里,但再说一次,不管你是否使用,都是你自己的选择。只要平台的实现支持您需要的功能(即提供您请求的接口版本),Qt就可以方便地为您提供完整的、功能解析的OpenGL API

  • 对。但它不是Python模块提供的版本,而是底层平台提供的版本。当平台不支持特定功能时,您将得到一个异常。Python只是为您提供函数地址解析,它本身并没有实现任何OpenGL——它只提供了一种体面的方式来使用您的平台从Python提供的内容(与C相比)

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

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

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

    函数本身可以通过
    QAbstractOpenGLFunctions
    接口获得,这是最原始的

  • Qt提供了有用的便利类,在C数据结构之上添加了可用的接口——它们没有任何不纯之处,您也不会被迫使用它们。事实上,它们不能通过基本的OpenGL接口使用。一旦有了上下文,就可以使用它的函数
    #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